impostare DateTime all'inizio del mese


97

Come posso impostare un DateTime sul primo del mese in C #?


l'inizio del mese in corso?
Phil Gan

1
quindi cosa ottenere al riguardo, .. la data di ogni mese inizia con 1..vuole sapere il giorno dell'inizio del mese
Shekhar_Pro

Se siamo a gennaio, dovrebbe essere visualizzato l'1 gennaio 2011 e il febbraio, quindi l'1 febbraio 2011
apprendendo

puoi esaminare questo
V4Vendetta

Risposte:


204
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

62
Un consiglio: mettilo sempre DateTime.Nowin una variabile e usala se intendi utilizzare il valore ripetutamente. C'è una piccola possibilità di errore nel caso in cui questo codice venga eseguito esattamente intorno a mezzanotte; le due chiamate a DateTime.Nowpossono accadere su entrambi i lati della mezzanotte causando effetti possibilmente strani.
Fredrik Mörk

Buon punto. Penso che la mezzanotte di capodanno sia il momento in cui questo potrebbe potenzialmente causare un problema.
Nick Jones

1
Non solo Capodanno. Sarebbe un problema a mezzanotte dell'ultimo giorno di qualsiasi mese. In ogni caso, sarebbe stato un problema solo se fosse eseguito in quel nanosecondo di mezzanotte alla fine del mese. Ma da quando hai corretto il codice, ora va tutto bene.
Doug S

1
perché stai usando "var" invece di "DateTime"?
markthewizard1234

4
@ markthewizard1234 principalmente perché i programmatori C # sono pigri. Quindi usiamo var quando possibile poiché sono solo tre caratteri. Ci sono altri motivi, ma credo che questo sia il motivo principale per cui la maggior parte delle persone lo fa.
Tim Pohlmann

41

Qualcosa del genere funzionerebbe

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);

4
Come ha commentato Fredrik Mork sulla risposta di Nick Jones, è meglio memorizzare il Datetime in una variabile quando lo si utilizza più volte, per garantire l'assenza di problemi intorno alla mezzanotte dell'ultimo giorno del mese. Quindi: DateTime oggi = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Doug S

9
public static DateTime FirstDayOfMonth(this DateTime current)
{
    return current.AddDays(1 - current.Day);
}

1
È meglio perché mantiene il fuso orario.
Rosdi Kasim

8

Un po 'in ritardo per la festa, ma ecco un metodo di estensione che ha funzionato per me

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}

1
Il problema con questo è che non mantiene il fuso orario originale.
Mike Cole

2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

Puoi usare qualsiasi altra cosa invece di DateTime.Now


2

Ho appena creato alcuni metodi di estensione basati sulla risposta di Nick e altri su SO

public static class DateTimeExtensions 
{
    /// <summary>
    /// get the datetime of the start of the week
    /// </summary>
    /// <param name="dt"></param>
    /// <param name="startOfWeek"></param>
    /// <returns></returns>
    /// <example>
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
    /// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
    /// </example>
    /// <remarks>http://stackoverflow.com/a/38064/428061</remarks>
    public static System.DateTime StartOfWeek(this System.DateTime dt, DayOfWeek startOfWeek)
    {
        var diff = dt.DayOfWeek - startOfWeek;
        if (diff < 0)
            diff += 7;

        return dt.AddDays(-1 * diff).Date;
    }

    /// <summary>
    /// get the datetime of the start of the month
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    /// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>
    public static System.DateTime StartOfMonth(this System.DateTime dt) =>
        new System.DateTime(dt.Year, dt.Month, 1);


    /// <summary>
    /// get datetime of the start of the year
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static System.DateTime StartOfYear(this System.DateTime dt) => 
         new System.DateTime(dt.Year, 1, 1);

}

0

Questo dovrebbe essere efficiente e corretto:

DateTime RoundDateTimeToMonth(DateTime time)
{
    long ticks = time.Ticks;
    return new DateTime((ticks / TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind);
}

Qui ticks / TimeSpan.TicksPerDayrestituisce il conteggio dei giorni interi fino a un dato timee - time.Day + 1reimposta questo conteggio all'inizio del mese.


0

Spero che questo ti aiuti.

textbox1.Text = "01-" + DateTime.Now.ToString ("MMM-yyyy");


-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));

3
Questo è un bel duplicato della risposta di Fubo, non credi?
Thomas Ayoub

2
Sebbene questo codice possa risolvere il problema, si consiglia sempre di aggiungere una spiegazione che spieghi perché / come funziona.
BDL

@ThomasAyoub - No, questo non è un duplicato della risposta di fubo in quanto non conterrà il portain del tempo.
Jay Shah

@BDL - Penso che sia molto semplice da capire che non richiede spiegazioni. Ma per tua informazione, ho preso la data Utc corrente e poi ho sottratto (Giorni della data corrente - 1) da essa per ottenere la data di inizio del mese, cioè 1 (non 0 ed è per questo che ho sottratto 1). E sì, questo risolverà sicuramente il problema.
Jay Shah
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.