Un consejo: ponga siempre DateTime.Nowuna variable y úsela si va a utilizar el valor repetidamente. Existe una pequeña posibilidad de error en caso de que este código se ejecute exactamente alrededor de la medianoche; las dos llamadas a DateTime.Nowpueden ocurrir a cada lado de la medianoche y causar efectos posiblemente extraños.
Fredrik Mörk
Buen punto. Creo que la medianoche de la víspera de año nuevo es el momento en que esto podría causar un problema.
Nick Jones
1
No solo año nuevo. Sería un problema a la medianoche del último día de cualquier mes. En cualquier caso, solo sería un problema si se ejecutara en ese mismo nanosegundo de la medianoche al final del mes. Pero desde que arreglaste tu código, todo está bien ahora.
Doug S
1
¿Por qué estás usando "var" en lugar de "DateTime"?
markthewizard1234
4
@ markthewizard1234 principalmente porque los programadores de C # son vagos. Así que usamos var siempre que sea posible, ya que solo tiene tres caracteres. Hay otras razones, pero creo que esta es la razón principal por la que la mayoría de la gente lo hace.
Como Fredrik Mork comentó en la respuesta de Nick Jones, es mejor almacenar la fecha y hora en una variable cuando la usa varias veces, para garantizar que no haya problemas alrededor de la medianoche del último día del mes. Entonces: DateTime today = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day);
Acabo de crear algunos métodos de extensión basados en la respuesta de Nick y otros en el SO
publicstaticclassDateTimeExtensions{/// <summary>/// get the datetime of the start of the week/// </summary>/// <param name="dt"></param>/// <param name="startOfWeek"></param>/// <returns></returns>/// <example>/// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);/// DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);/// </example>/// <remarks>http://stackoverflow.com/a/38064/428061</remarks>publicstaticSystem.DateTimeStartOfWeek(thisSystem.DateTime dt,DayOfWeek startOfWeek){var diff = dt.DayOfWeek- startOfWeek;if(diff <0)
diff +=7;return dt.AddDays(-1* diff).Date;}/// <summary>/// get the datetime of the start of the month/// </summary>/// <param name="dt"></param>/// <returns></returns>/// <remarks>http://stackoverflow.com/a/5002582/428061</remarks>publicstaticSystem.DateTimeStartOfMonth(thisSystem.DateTime dt)=>newSystem.DateTime(dt.Year, dt.Month,1);/// <summary>/// get datetime of the start of the year/// </summary>/// <param name="dt"></param>/// <returns></returns>publicstaticSystem.DateTimeStartOfYear(thisSystem.DateTime dt)=>newSystem.DateTime(dt.Year,1,1);}
Aquí ticks / TimeSpan.TicksPerDaydevuelve el recuento de días completos hasta el dado timey - time.Day + 1restablece este recuento al comienzo del mes.
Esto es un duplicado de la respuesta de fubo, ¿no crees?
Thomas Ayoub
2
Aunque este código puede resolver el problema, siempre se recomienda agregar una explicación que explique por qué / cómo funciona.
BDL
@ThomasAyoub: no, esto no es un duplicado bastante de la respuesta de fubo, ya que no contendrá el tiempo.
Jay Shah
@BDL: creo que es muy sencillo de entender, lo que no requiere explicación. Pero para su información, tomé la fecha Utc actual y luego le resté (Días de la fecha actual - 1) para obtener la fecha de inicio del mes, es decir, 1 (no 0 y es por eso que resté 1). Y sí, esto definitivamente resolverá el problema.
Respuestas:
fuente
DateTime.Now
una variable y úsela si va a utilizar el valor repetidamente. Existe una pequeña posibilidad de error en caso de que este código se ejecute exactamente alrededor de la medianoche; las dos llamadas aDateTime.Now
pueden ocurrir a cada lado de la medianoche y causar efectos posiblemente extraños.Algo como esto funcionaría
fuente
fuente
Un poco tarde para la fiesta, pero aquí hay un método de extensión que me sirvió
fuente
Puede usar cualquier otra cosa en lugar de DateTime.Now
fuente
Acabo de crear algunos métodos de extensión basados en la respuesta de Nick y otros en el SO
fuente
Esto debería ser eficaz y correcto:
Aquí
ticks / TimeSpan.TicksPerDay
devuelve el recuento de días completos hasta el dadotime
y- time.Day + 1
restablece este recuento al comienzo del mes.fuente
Espero que esto te ayude.
textbox1.Text = "01-" + DateTime.Now.ToString ("MMM-aaaa");
fuente
fuente