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 #?


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

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.


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;

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;

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

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

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.


10

Puedes probar esto

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

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! ^ _ ^


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

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

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:


0

Puedes usar el siguiente código:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

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

int total_days = (EndDate - StartDate).TotalDays

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.