establecer DateTime al comienzo del mes


97

¿Cómo puedo establecer una fecha y hora en el primer día del mes en C #?


el comienzo del mes actual?
Phil Gan

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

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

puedes ver esto
V4Vendetta

Respuestas:


204
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);

62
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.
Tim Pohlmann

41

Algo como esto funcionaría

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

4
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);
Doug S

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

1
Esto es mejor ya que mantiene la zona horaria.
Rosdi Kasim

8

Un poco tarde para la fiesta, pero aquí hay un método de extensión que me sirvió

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

1
El problema con esto es que no mantiene la zona horaria original.
Mike Cole

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

Puede usar cualquier otra cosa en lugar de DateTime.Now


2

Acabo de crear algunos métodos de extensión basados ​​en la respuesta de Nick 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 System.DateTime StartOfWeek(this System.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 System.DateTime StartOfMonth(this System.DateTime dt) =>
        new System.DateTime(dt.Year, dt.Month, 1);


    /// <summary>
    /// get datetime of the start of the year
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static System.DateTime StartOfYear(this System.DateTime dt) => 
         new System.DateTime(dt.Year, 1, 1);

}

0

Esto debería ser eficaz y correcto:

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

Aquí ticks / TimeSpan.TicksPerDaydevuelve el recuento de días completos hasta el dado timey - time.Day + 1restablece este recuento al comienzo del mes.


0

Espero que esto te ayude.

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


-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));

3
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.
Jay Shah
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.