2013-08-21 16 views
5

Se ho un DateTime che è, ad esempio, 2012-05-24, qual è il modo più rapido per convertirlo in una data che è l'ultimo giorno del mese (2012-05-31).Come trasformare DateTime nell'ultimo giorno del mese?

+0

Già questa domanda può discusso ** [ref] [1] ** [1]:. Http://stackoverflow.com/questions/2493032/how-to-get-the-last -giorno-di-un-mese –

risposta

14

Ebbene si può utilizzare:

DateTime date = ...; 
var endOfMonth = new DateTime(date.Year, date.Month, 
           DateTime.DaysInMonth(date.Year, date.Month)); 

Si noti che che creerà un DateTime con un Kind di Unspecified. Dovresti considerare cosa vuoi veramente fare Kind. (Oppure utilizzare la mia libreria Noda Time, dove occorre utilizzare un LocalDate invece.)

+0

perché hai usato il tipo 'var' invece di' DateTime'? –

+2

@SubinJacob: Sembra abbastanza chiaro, dato che sto chiamando esplicitamente 'new DateTime (...)'. Cambierò quello per 'date' però. –

+1

La mia risposta sembra inutile quando rispondi all'uomo :( –

3

Ecco alcuni metodi di estensione che uso:

public static class DateTimeExtensionMethods 
{ 
    public static DateTime StartOfMonth(this DateTime date) 
    { 
     return new DateTime(date.Year, date.Month, 1); 
    } 
    public static DateTime EndOfMonth(this DateTime date) 
    { 
     return date.StartOfMonth().AddMonths(1).AddSeconds(-1); 
    } 
} 

Si noti che nel mio caso io li sto usando per le query SQL, in modo Voglio che sia fino all'ultimo secondo dell'ultimo giorno del mese.

Sulla base di commenti, sì, se si desidera solo desidera che la data e non il tempo, è possibile utilizzare:

public static DateTime EndOfMonth(this DateTime date) 
    { 
     return date.StartOfMonth().AddMonths(1).AddDays(-1); 
    } 

o semplicemente usare la proprietà Date del risultato per ottenere solo la parte di data, allora soddisfa entrambi i casi a seconda di come lo si utilizza.

+0

Quella "fine del mese" darà le 23:59:59 dell'ultimo giorno del mese, che non è quello che è stato descritto Certo, l'OP potrebbe usare la proprietà 'Date', ma è più pulito solo per creare un nuovo' DateTime' a mezzanotte, proprio come fa per 'StartOfMonth'. (E può essere fatto direttamente molto facilmente.) –

+0

Solo cambia invece .AddSeconds (-1) in .AddDays (-1) invece di. – Loyalar

+0

@ LarsJensen: A quel punto eliminerei il mio downvote, sì. Non sarebbe ancora la mia soluzione preferita, ma almeno sarebbe meglio. (È strano rimuovere "un secondo" in ogni caso - non è che questo rappresenti l'ultimo valore di "DateTime" del giorno.Uno * tick * sarebbe più ragionevole, ma di solito quando sono coinvolti i tempi è meglio usare un end-point esclusivo per un intervallo comunque ...) –

3

Prova questa

DateTime dt = DateTime.Parse("2012-05-24");    
DateTime lastDate = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month)); 
1

Prova questa

DateTime date = new DateTime(2012, 05, 24); 
DateTime endOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month)); 

uscita: 2012/05/31 12:00:00

È quindi possibile modificare questo al vostro formato richiesto .

Problemi correlati