Calcola la differenza tra due date (numero di giorni)?


1094

Vedo che a questa domanda è stata data una risposta per Java , JavaScript e PHP , ma non C #. Quindi, come si può calcolare il numero di giorni tra due date in C #?


7
L'ho trovato davvero utile .. ottenere un elenco di date tra la data di inizio e la data di fine Spero che questo aiuti chiunque lo cerchi in particolare in futuro :)
sys_debug

Gli operatori addizione e sottrazione sono sovraccarichi per i tipi DateTimee TimeSpancome ci si aspetterebbe. È tutto abbastanza semplice. - Che problema hai riscontrato?
BrainSlugs83,

Risposte:


2014

Supponendo StartDatee EndDatesono di tipo DateTime:

(EndDate - StartDate).TotalDays

549
Questa risposta è ovviamente corretta, ma puoi anche usarla (a - b).Daysse sei interessato ai giorni totali come intpiuttosto che doublecon una rappresentazione decimale della differenza del giorno parziale.
PFranchise,

25
questo restituirà 1 giorno in meno, 08/31 / 2013-08 / 01/2013 = 31 ma restituisce solo 30.
JRB,

60
@JasRajBishnoi - potresti voler controllare i tuoi calcoli. Che cos'è 31 - 1?
Greg Beech,

33
JasRaj aveva anche ragione nel senso che includendo entrambe le date restituisce un giorno in meno di differenza. Tutto dipende dalla prospettiva.
Fahad Abid Janjua,

28
@FahadAbidJanjua Non è una questione o una prospettiva, ma una questione di tempo, intendo, la parte del tempo della data. 31/08/2013 - 01/08/2013 significa davvero 31/08/2013 00:00:00 - 01/08/2013 00:00:00, il che spiega perché sono 30 giorni, perché il 31/08/2013 è appena iniziato. Ciò spiega anche perché, quando si esegue una query su una proprietà / campo DateTime, la condizione corretta per ottenere un intervallo è "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso,

161

La risposta migliore è corretta, tuttavia se desideri solo TUTTI i giorni come int e sei felice di rinunciare alla componente temporale della data, prendi in considerazione:

(EndDate.Date - StartDate.Date).Days

Sempre assumendo StartDatee EndDatesono di tipo DateTime.


7
La migliore risposta perché "numero di giorni" normalmente significa giorni interi. Vale la pena notare che Daysnon si ferma a 365 (come altre proprietà come Hours, Minutes, Secondquale valore nax è dove inizia il successivo struttura superiore). È lo stesso di TotalDaysma senza frazioni di giorno e ritorno intinvece di double.
Tim Schmelter,

Funzionerà sempre come previsto? Ad esempio, se uno dei giorni a confronto è un giorno di primavera "ora legale", la sottrazione potrebbe produrre un intervallo di tempo di 23 ore e, in tal caso, il valore di .Days in quell'arco di 23 ore sarà 0 ? (Ho provato a sperimentare questo da solo, ma i miei risultati finora non sono conclusivi - stackoverflow.com/questions/43644252/… )
Jon Schneider,

Sì, questo è quello di cui avevo bisogno - la risposta più preziosa cmon ora nessuno vuole pensare a minuti e secondi in giorni di calcolo
solujic

se è passato solo 1,5 giorni. La funzione Giorni mostrerà solo 1 Giorno? come posso modificarlo per mostrare 2 giorni? devo solo aggiungere sempre + 1 giorno?
CDrosos,

2
A questo proposito, perché molto spesso avresti bisogno di "giorni CALENDARIO tra due date", non solo "numero di intervalli di 24 ore". Ad esempio, devi visualizzare un'etichetta "X giorni fa" in una sequenza temporale. In questo caso la differenza tra "Lunedì 23:59" e "Martedì 7:00" dovrebbe essere "1 giorno (fa)" ... Quindi la .Dateparte è davvero utile. Spero
Alex

138

Utilizzare l'oggetto TimeSpan che è il risultato della sottrazione della data:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;

2
Eseguito l'upgrade semplicemente perché chiarisce che (d1 - d2) restituirà un oggetto TimeSpan.
Morvael,

47

Penso che questo farà quello che vuoi:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;

34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

1
In ogni caso per ottenere i giorni in mezzo nel formato DateTime? Perché ho bisogno di ogni data per modificare un determinato campo nelle tabelle :) Modifica: capito e pubblicato come risposta di seguito. Grazie
sys_debug il

4
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); lo farebbe funzionare su base annuale, non solo per il 2009 :)

1
Subtract () è OperatorOverload per DateTimes quindi è lo stesso "(xmas - DateTime.Today) .TotalDays - solo più a lungo.
Marc

20

Nel caso in cui qualcuno desideri un numero di giorni interi come doppio ( a, bdi tipo DateTime):

 (a.Date - b.Date).TotalDays

3
Questo sarà sempre un numero intero (ad esempio, n. 00000) perché la parte della data è sempre mezzanotte.
JoeNCA,

20
// Difference in days, hours, and minutes.

TimeSpan ts = EndDate - StartDate;

// Difference in days.

int differenceInDays = ts.Days; // This is in int
double differenceInDays= ts.TotalDays; // This is in double

// Difference in Hours.
int differenceInHours = ts.Hours; // This is in int
double differenceInHours= ts.TotalHours; // This is in double

// Difference in Minutes.
int differenceInMinutes = ts.Minutes; // This is in int
double differenceInMinutes= ts.TotalMinutes; // This is in double

Puoi anche ottenere la differenza in secondi, millisecondi e tick.


10

Puoi provare questo

EndDate.Date.Subtract(DateTime.Now.Date).Days

2
Questo in realtà mi ha aiutato al meglio in quanto la mia differenza di data era di mezza giornata, ma ancora quando l'America è 1 giorno indietro rispetto all'Australia, devo vedere che in realtà c'è una differenza di un giorno. Le altre risposte menzionate in questa discussione mostravano zero o qualche numero doppio sotto 1 che non mi serve.
Barry Guvenkaya,

Questa è la risposta migliore quando lo scopo è verificare se la data è già passata al giorno successivo, indipendentemente dal fatto che in termini di tempo non sia un giorno intero di 24 ore.
oneberenjena,

4

Per i principianti come me che si imbatteranno in questo piccolo problema, in una riga semplice, con la conversione del campione in int :

int totalDays = Convert.ToInt32((DateTime.UtcNow.Date - myDateTime.Date).TotalDays);

Questo calcola i giorni totali da oggi (DateTime.UtcNow.Date) alla data desiderata (myDateTime.Date).

Se myDateTime è ieri, o data precedente a oggi, questo darà un risultato intero positivo (+).

D'altra parte, se myDateTime è domani o in una data futura, questo darà un risultato intero negativo (-) a causa delle regole di addizione.

Buona programmazione! ^ _ ^


4

L'uso di un periodo di tempo risolverebbe i problemi in quanto ha molti attributi:

DateTime strt_date = DateTime.Now;
DateTime end_date = Convert.ToDateTime("10/1/2017 23:59:59");
//DateTime add_days = end_date.AddDays(1);
TimeSpan nod = (end_date - strt_date);
Console.WriteLine(strt_date + "" + end_date + "" + "" + nod.TotalHours + "");
Console.ReadKey();

3

Per ae bcome due DateTimetipi:

DateTime d = DateTime.Now;
DateTime c = DateTime.Now;
c = d.AddDays(145);
string cc;
Console.WriteLine(d);
Console.WriteLine(c);
var t = (c - d).Days;
Console.WriteLine(t);
cc = Console.ReadLine();

0

Dichiara innanzitutto una classe che tornerà più tardi:

public void date()
{
    Datetime startdate;
    Datetime enddate;
    Timespan remaindate;

    startdate = DateTime.Parse(txtstartdate.Text).Date;
    enddate = DateTime.Parse(txtenddate.Text).Date;

    remaindate = enddate - startdate;

    if (remaindate != null)
    {
        lblmsg.Text = "you have left with " + remaindate.TotalDays + "days.";
    }
    else
    {
        lblmsg.Text = "correct your code again.";
    }
}

protected void btncal_Click(object sender, EventArgs e)
{
    date();
}

Utilizzare un controllo pulsante per chiamare la classe sopra. Ecco un esempio:


0

Puoi usare il codice qui sotto:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

Ottieni la differenza tra le due date e quindi ottieni i giorni da:

int total_days = (EndDate - StartDate).TotalDays

1
Sebbene questo frammento di codice possa risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che in futuro stai rispondendo alla domanda dei lettori e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non aggiungere il tuo codice a commenti esplicativi, in quanto ciò riduce la leggibilità sia del codice che delle spiegazioni!
Arrivederci StackExchange il

2
TotalDays restituisce un doppio: msdn.microsoft.com/en-us/library/… Quindi hai bisogno di una conversione in int
qnguyen

-21
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    DateTime d = Calendar1.SelectedDate;
    // int a;
    TextBox2.Text = d.ToShortDateString();
    string s = Convert.ToDateTime(TextBox2.Text).ToShortDateString();
    string s1 =  Convert.ToDateTime(Label7.Text).ToShortDateString();
    DateTime dt = Convert.ToDateTime(s).Date;
    DateTime dt1 = Convert.ToDateTime(s1).Date;
    if (dt <= dt1)
    {
        Response.Write("<script>alert(' Not a valid Date to extend warranty')</script>");
    }
    else
    {
        string diff = dt.Subtract(dt1).ToString();
        Response.Write(diff);
        Label18.Text = diff;
        Session["diff"] = Label18.Text;
    }
}   

21
Questo codice è sbagliato in molti modi! 1) Molti codici Winforms non correlati alla domanda. 2) Modo cablato per mostrare le finestre di messaggio usando (immagino un controllo WebBrowser). 3) utilizzando un controllo WebBrowser per mostrare un testo che è già mostrato nell'etichetta. 4) Utilizzo di OperatorOverload Subtract () (impostazione predefinita per le operazioni "-") che viene comunque utilizzata se si esegue "MyDateA - MyDateB". 5) Nessuna spiegazione a questo mucchio di codice.
Marc,
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.