Quiero obtener el primer día y el último día del mes en el que se encuentra una fecha determinada. La fecha proviene de un valor en un campo de IU.
Si estoy usando un selector de tiempo, podría decir
var maxDay = dtpAttendance.MaxDate.Day;
Pero estoy tratando de obtenerlo de un objeto DateTime. Entonces si tengo esto ...
DateTime dt = DateTime.today;
¿Cómo obtener el primer día y el último día del mes dt
?
_Date
variable. ¿Qué "mínimo y máximo" estás tratando de obtener de ese valor?Respuestas:
DateTime
La estructura almacena un solo valor, no un rango de valores.MinValue
yMaxValue
son campos estáticos, que contienen un rango de valores posibles para instancias deDateTime
estructura. Estos campos son estáticos y no se relacionan con una instancia particular deDateTime
. Se relacionan con elDateTime
tipo en sí.Lectura sugerida: estática (Referencia de C #)
ACTUALIZACIÓN: Obtener rango de mes:
fuente
lastDayofMonth
serlofirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, pero si no nos importa la parte del tiempo y pensamos solo en la parte de la fecha, entonces los días funcionan bien< firstDayOfNextMonth
lugar de<= lastDayOfMonth
. De esa manera, siempre funcionará independientemente de la granularidad. (Estoy seguro de que las garrapatas estarán bien, pero quién sabe lo que depara el futuro ... ¿nanoticks?)Este es más un comentario largo sobre las respuestas de @Sergey y @ Steffen. Habiendo escrito un código similar en el pasado, decidí verificar lo que era más eficiente mientras recordaba que la claridad también es importante.
Resultado
Aquí hay un ejemplo de un resultado de ejecución de prueba para 10 millones de iteraciones:
Código
Solía LINQPad 4 (en C # modo de programa) para ejecutar las pruebas con la optimización del compilador de encendido. Aquí está el código probado factorizado como métodos de extensión para mayor claridad y conveniencia:
Análisis
Me sorprendieron algunos de estos resultados.
Aunque no hay mucho,
FirstDayOfMonth_AddMethod
fue un poco más rápido queFirstDayOfMonth_NewMethod
en la mayoría de las pruebas. Sin embargo, creo que este último tiene una intención un poco más clara y por eso tengo preferencia por eso.LastDayOfMonth_AddMethod
fue un claro perdedor contraLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
yLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Entre los tres más rápidos no hay mucho, por lo que se reduce a su preferencia personal. Elijo la claridadLastDayOfMonth_NewMethodWithReuseOfExtMethod
con la reutilización de otro método de extensión útil. En mi humilde opinión, su intención es más clara y estoy dispuesto a aceptar el pequeño costo de rendimiento.LastDayOfMonth_SpecialCase
supone que está proporcionando el primer día del mes en el caso especial en el que ya haya calculado esa fecha y utiliza el método addDateTime.DaysInMonth
para obtener el resultado. Esto es más rápido que las otras versiones, como era de esperar, pero a menos que tenga una necesidad desesperada de velocidad, no veo el punto de tener este caso especial en su arsenal.Conclusión
Aquí hay una clase de método de extensión con mis elecciones y, en general, de acuerdo con @Steffen, creo:
Si has llegado hasta aquí, ¡gracias por tu tiempo! Ha sido divertido: ¬). Comente si tiene alguna otra sugerencia para estos algoritmos.
fuente
LastDayOfMonth_AddMethod_SpecialCase
(o algo así). Esperando el primer día del mes como parámetro, creo que lo más rápido debería ser lo queLastDayOfMonth_AddMethod
hace. Eso sería tan simple como:return value.AddMonths(1).AddDays(-1);
Obtención del rango de meses con .Net API (solo otra forma)
fuente
"
Last day of month
" es en realidad "First day of *next* month, minus 1
". Esto es lo que uso, no es necesario el método "DaysInMonth":NOTA: La razón que uso
AddMinutes(-1)
, noAddDays(-1)
aquí, es porque generalmente necesita estas funciones de fecha para informar durante un período de fecha, y cuando crea un informe para un período, la "fecha de finalización" debería ser algo asíOct 31 2015 23:59:59
para que su informe funcione correctamente - Incluyendo todos los datos del último día del mes.Es decir, realmente obtienes el "último momento del mes" aquí. No el último día.
OK, me voy a callar ahora.
fuente
fuente
description
que ayude a explicar su código. GraciasAquí puede agregar un mes para el primer día del mes actual que eliminar 1 día de ese día.
fuente
Si solo te importa la fecha
Si quieres ahorrar tiempo
fuente
La respuesta aceptada aquí no tiene en cuenta el tipo de instancia de DateTime. Por ejemplo, si su instancia original de DateTime era un tipo UTC, al crear una nueva instancia de DateTime, creará una instancia de tipo desconocido que luego se tratará como hora local según la configuración del servidor. Por lo tanto, la forma más adecuada de obtener la primera y la última fecha del mes sería esta:
De esta forma, se conserva el tipo original de la instancia de DateTime.
fuente
Prueba este:
fuente
Utilicé esto en mi script (funciona para mí) pero necesitaba una fecha completa sin la necesidad de recortarla solo a la fecha y no a la hora.
fuente
Prueba esto. Básicamente, calcula el número de días que han pasado
DateTime.Now
, luego resta uno de eso y usa el nuevo valor para encontrar el primero del mes actual. A partir de ahí, usa esoDateTime
y usa.AddMonths(-1)
para obtener el primero del mes anterior.Obtener el último día del mes pasado hace básicamente lo mismo, excepto que agrega uno al número de días en el mes y resta ese valor
DateTime.Now.AddDays
, dándole el último día del mes anterior.fuente
Para la cultura persa
fuente
Puedes hacerlo
fuente
manera fácil de hacerlo
fuente
fuente