establecer DateTime al comienzo del mes

97

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

aprendizaje
fuente
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);
Nick Jones
fuente
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);
V4Vendetta
fuente
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);
}
fubo
fuente
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);
  }
}
Colin Banbury
fuente
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

Rotman
fuente
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);

}
Soren
fuente
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.

nayato
fuente
0

Espero que esto te ayude.

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

Ann Sara
fuente
-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));
Jay Shah
fuente
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