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 #?
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:
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.
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:
¿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):
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 intdouble differenceInDays= ts.TotalDays;// This is in double// Difference in Hours.int differenceInHours = ts.Hours;// This is in intdouble differenceInHours= ts.TotalHours;// This is in double// Difference in Minutes.int differenceInMinutes = ts.Minutes;// This is in intdouble differenceInMinutes= ts.TotalMinutes;// This is in double
También puede obtener la diferencia en segundos, milisegundos y tics.
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.
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();
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!
protectedvoidCalendar1_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;}}
¡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.
DateTime
y,TimeSpan
como es de esperar. Todo es bastante sencillo. - ¿Qué problema exacto encontraste?Respuestas:
Suponiendo
StartDate
yEndDate
son de tipoDateTime
:fuente
(a - b).Days
si usted está interesado en el total de días como unint
lugar de unadouble
con una representación decimal de la diferencia día parcial.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:
Nuevamente asumiendo
StartDate
yEndDate
son de tipoDateTime
.fuente
Days
no se detiene en 365 (como otras propiedades comoHours
,Minutes
,Second
cuyo valor Nax es donde comienza la siguiente propiedad superior). Es lo mismoTotalDays
pero sin fracciones de un día y regresando enint
lugar dedouble
..Date
parte es realmente útil. Espero que me esté aclarandoUse el objeto TimeSpan que es el resultado de la sustracción de la fecha:
fuente
Creo que esto hará lo que quieras:
fuente
fuente
En caso de que alguien quiera un número de días completos como doble (
a
,b
de tipoDateTime
):fuente
También puede obtener la diferencia en segundos, milisegundos y tics.
fuente
Puedes probar esto
fuente
Para principiantes como yo, que tropezarán con este pequeño problema, en una línea simple, con conversión de muestra a int :
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! ^ _ ^
fuente
Usar un intervalo de tiempo resolvería los problemas ya que tiene muchos atributos:
fuente
Para
a
yb
como dosDateTime
tipos:fuente
Primero declara una clase que volverá más tarde:
Use un control de botón para llamar a la clase anterior. Aquí hay un ejemplo:
fuente
Puedes usar el siguiente código:
fuente
Obtenga la diferencia entre las dos fechas y luego obtenga los días de:
fuente
fuente