Calcular la diferencia entre dos fechas (número de días)?

1094

Veo que esta pregunta ha sido respondida para Java , JavaScript y PHP , pero no para C #. Entonces, ¿cómo podría uno calcular el número de días entre dos fechas en C #?

leora
fuente
77
Encontré esto bastante útil realmente ... obtener una lista de fechas entre la fecha de inicio y la fecha de finalización Espero que esto ayude a cualquiera que busque esto en particular en el futuro :)
sys_debug
Los operadores de suma y resta están sobrecargados para los tipos DateTimey, TimeSpancomo es de esperar. Todo es bastante sencillo. - ¿Qué problema exacto encontraste?
BrainSlugs83

Respuestas:

2015

Suponiendo StartDatey EndDateson de tipo DateTime:

(EndDate - StartDate).TotalDays
Greg Beech
fuente
549
Esta respuesta es obviamente correcta, pero también se puede usar (a - b).Dayssi usted está interesado en el total de días como un intlugar de una doublecon una representación decimal de la diferencia día parcial.
PFranchise
25
esto devolverá 1 días menos, 31/08 / 2013-08 / 01/2013 = 31 pero esto solo devolverá 30.
JRB
6060
@JasRajBishnoi: es posible que desee verificar sus matemáticas. ¿Qué es 31-1?
Greg Beech
33
JasRaj también tenía razón en el sentido de que, inclusive en ambas fechas, devuelve un día menos de diferencia. Todo depende de la perspectiva.
Fahad Abid Janjua
28
@FahadAbidJanjua No es una cuestión o perspectiva, sino una cuestión de tiempo, es decir, la parte del tiempo de la fecha. 31/08/2013 - 01/08/2013 realmente significa 31/08/2013 00:00:00 - 01/08/2013 00:00:00, lo que explica por qué son 30 días, porque el día 08/31/2013 es empezando. Eso también explica por qué, cuando se consulta en una propiedad / campo de DateTime, la condición adecuada para obtener un rango es "DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays (1)"
Miguel Veloso
161

La respuesta principal es correcta, sin embargo, si solo desea TODOS los días como int y está feliz de renunciar al componente de tiempo de la fecha, considere:

(EndDate.Date - StartDate.Date).Days

Nuevamente asumiendo StartDatey EndDateson de tipo DateTime.

Darren
fuente
77
La mejor respuesta porque "número de días" normalmente significa días enteros. Vale la pena señalar que Daysno se detiene en 365 (como otras propiedades como Hours, Minutes, Secondcuyo valor Nax es donde comienza la siguiente propiedad superior). Es lo mismo TotalDayspero sin fracciones de un día y regresando en intlugar de double.
Tim Schmelter
¿Funcionará siempre como se esperaba? Por ejemplo, si uno de los días que se compara es un día de "horario de verano", la resta podría producir un intervalo de tiempo de 23 horas y, de ser así, el valor de .Días en ese lapso de 23 horas sería 0 ? (Intenté experimentar con esto yo mismo, pero mis resultados no son concluyentes hasta ahora - stackoverflow.com/questions/43644252/… )
Jon Schneider
Sí, esto es lo que necesitaba: la respuesta más valiosa, ahora nadie quiere pensar en minutos y segundos en el cálculo de días
solujic
si solo 1,5 días ha pasado esta función .Days mostrará solo 1 día? ¿Cómo puedo modificarlo para mostrar 2 días? solo tengo que agregar siempre + 1 día?
CDrosos
2
Votando esto, porque muy a menudo necesitarías "días CALENDARIO entre dos fechas", no solo "número de intervalos de 24 horas". Por ejemplo, debe mostrar una etiqueta "Hace X días" en una línea de tiempo. En este caso, la diferencia entre "Lunes 11:59 pm" y "Martes 7:00 am" debería ser "1 día (hace)" ... Entonces, la .Dateparte es realmente útil. Espero que me esté aclarando
Alex
138

Use el objeto TimeSpan que es el resultado de la sustracción de la fecha:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;
Vitaliy Liptchinsky
fuente
2
Votó simplemente porque deja en claro que (d1 - d2) devolverá un objeto TimeSpan.
Morvael
47

Creo que esto hará lo que quieras:

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

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;
pirocúmulo
fuente
34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
Philip Wallace
fuente
1
¿De todos modos para obtener los días intermedios en formato DateTime? Porque necesito que cada fecha modifique un determinado campo en las tablas :) Editar: lo obtuve y lo publiqué como respuesta a continuación. Gracias
sys_debug
44
DateTime xmas = new DateTime (DateTime.Today.Year, 12, 25); lo haría funcionar año tras año, no solo 2009 :)
1
Subtract () es el OperatorOverload para DateTimes, así que es el mismo "(xmas - DateTime.Today) .TotalDays - solo más tiempo.
Marc
20

En caso de que alguien quiera un número de días completos como doble ( a, bde tipo DateTime):

 (a.Date - b.Date).TotalDays
reyCachorro
fuente
3
Sin embargo, este siempre será un número entero (es decir, n.00000) porque la porción de Fecha siempre es medianoche.
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

También puede obtener la diferencia en segundos, milisegundos y tics.

Vijay Maheriya
fuente
10

Puedes probar esto

EndDate.Date.Subtract(DateTime.Now.Date).Days
Rohidas Kadam
fuente
2
Esto realmente me ayudó mejor ya que mi diferencia de fecha fue medio día, pero cuando Estados Unidos está 1 día detrás de Australia, necesito ver que realmente hay un día de diferencia. Las otras respuestas mencionadas en este hilo mostraban cero o algún número doble debajo de 1 que no necesito.
Barry Guvenkaya
Esta es la mejor respuesta cuando el propósito es verificar si la fecha ya pasó al día siguiente, sin importar si en términos de tiempo no es un día completo de 24 horas.
oneberenjena
4

Para principiantes como yo, que tropezarán con este pequeño problema, en una línea simple, con conversión de muestra a int :

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

Esto calcula el total de días desde hoy (DateTime.UtcNow.Date) hasta la fecha deseada (myDateTime.Date).

Si myDateTime es ayer o una fecha anterior a la actual, esto dará un resultado entero positivo (+).

Por otro lado, si myDateTime es mañana o en la fecha futura, esto dará un resultado entero negativo (-) debido a las reglas de adición.

¡Feliz codificación! ^ _ ^

Codificador de acera
fuente
4

Usar un intervalo de tiempo resolvería los problemas ya que tiene muchos atributos:

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();
Vijay Vj
fuente
3

Para ay bcomo dos DateTimetipos:

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();
Pratyush Dhanuka
fuente
0

Primero declara una clase que volverá más tarde:

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();
}

Use un control de botón para llamar a la clase anterior. Aquí hay un ejemplo:

Muba
fuente
0

Puedes usar el siguiente código:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds
Code_Worm
fuente
0

Obtenga la diferencia entre las dos fechas y luego obtenga los días de:

int total_days = (EndDate - StartDate).TotalDays
Muhamad Eissa
fuente
1
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. ¡Intente también no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones!
Goodbye StackExchange
2
TotalDays devuelve un doble: msdn.microsoft.com/en-us/library/… Entonces necesita una conversión a 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;
    }
}   
sangeetha
fuente
21
¡Este código está mal de muchas maneras! 1) Un montón de código Winforms no relacionado con la pregunta. 2) Forma cableada de mostrar cuadros de mensaje usando (supongo que un control WebBrowser). 3) usar un control WebBrowser para mostrar un texto que ya se muestra en la etiqueta. 4) Uso de OperatorOverload Subtract () (predeterminado para operaciones "-") que se utiliza de todos modos si hace un "MyDateA - MyDateB". 5) No hay explicación para este montón de código.
Marc