2011-02-15 20 views
77

¿Cómo puedo establecer un DateTime para el primer día del mes en C#?establecer DateTime al inicio del mes

+0

¿el comienzo del mes actual? –

+1

, entonces, ¿qué hacer al respecto? ... la fecha de cada mes comienza con 1.. Quiere saber el Día al inicio del mes –

+0

Si estamos en enero, debería mostrar 01-ene-2011 y en febrero, luego 01-feb-2011 – learning

Respuesta

171
var now = DateTime.Now; 
var startOfMonth = new DateTime(now.Year,now.Month,1); 
+52

Un consejo: siempre ponga 'DateTime. Ahora' en una variable y úsala si vas a usar 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.Now' pueden ocurrir a cada lado de la medianoche causando efectos posiblemente extraños. –

+0

Buen punto. Creo que la medianoche del año nuevo es el momento en que esto podría causar un problema. –

+1

No solo de 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 medianoche a fin de mes. Pero desde que arregló su código, todo está bien ahora. –

2
DateTime now = DateTime.Now; 
DateTime date = new DateTime(now.Year, now.Month, 1); 

Se puede utilizar cualquier otra cosa en lugar de DateTime.Now

38

Algo como esto funcionaría

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day); 
+0

+1 porque se ejecuta más rápido que el otro método con la instanciación –

+2

Como Fredrik Mork comentó la respuesta de Nick Jones, es mejor almacenar el Datetime en una variable cuando lo está usando varias veces, para garantizar que no haya problemas alrededor de la medianoche en el último día del mes. Entonces: DateTime hoy = DateTime.Today; DateTime firstDay = today.AddDays (1-today.Day); –

0

Ésta debe ser eficiente y correcta:

DateTime RoundDateTimeToMonth(DateTime time) 
{ 
    long ticks = time.Ticks; 
    return new DateTime((ticks/TimeSpan.TicksPerDay - time.Day + 1) * TimeSpan.TicksPerDay, time.Kind); 
} 

Aquí ticks/TimeSpan.TicksPerDay re convierte la cuenta de días completos hasta time y - time.Day + 1 restablece esta cuenta hasta el comienzo del mes.

+0

Creo que se reinició al principio del día. – SuperLucky

+0

@SuperLucky: no, no es así. – nayato

7

Un poco tarde a la fiesta, pero aquí es un método de extensión que hizo el truco para mí

public static class DateTimeExtensions 
{ 
    public static DateTime FirstDayOfMonth(this DateTime dt) 
    { 
    return new DateTime(dt.Year, dt.Month, 1); 
    } 
} 
+0

El problema con esto es que no mantiene la zona horaria original. –

+0

@MikeCole: Acepta dos manos contigo –

4
public static DateTime FirstDayOfMonth(this DateTime current) 
{ 
    return current.AddDays(1 - current.Day); 
} 
0

acabo de crear algunos métodos de extensión en base a Nick respuesta y otros en el SO

public static class DateTimeExtensions 
    { 
     /// <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> 
     public static DateTime StartOfWeek(this 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> 
     public static DateTime StartOfMonth(this DateTime dt) 
     { 
      var now = DateTime.Now; 
      return new DateTime(now.Year, now.Month, 1); 
     } 

     /// <summary> 
     /// get datetime of the start of the year 
     /// </summary> 
     /// <param name="dt"></param> 
     /// <returns></returns> 
     public static DateTime StartOfYear(this DateTime dt) 
     { 
      var now = DateTime.Now; 
      return new DateTime(now.Year, 1, 1); 
     } 
    } 
-1
var currentDate = DateTime.UtcNow.Date; 
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1)); 
+2

Esto es un duplicado de la respuesta de Fubo, ¿no crees? –

+1

Aunque este código podría resolver el problema, siempre se recomienda agregar una explicación que explique por qué y cómo funciona. – BDL

+0

@ThomasAyoub - No, esto no es un duplicado completo de la respuesta de fubo, ya que no contendrá la portada de tiempo. –

0

la esperanza que esto le ayuda.

textbox1.Text = "01-" + DateTime.Now.ToString ("MMM-yyyy");

Cuestiones relacionadas