Stellen Sie DateTime auf Monatsbeginn ein


96

Wie kann ich in C # eine DateTime auf den ersten des Monats setzen?


der Beginn des laufenden Monats?
Phil Gan

1
Also, was soll ich dagegen tun? Jedes Monatsdatum beginnt mit 1. Möchte er den Tag am Monatsanfang wissen
Shekhar_Pro

Wenn wir im Januar sind, sollte es 01-Jan-2011 und im Februar zeigen, dann 01-Feb-2011
Lernen

Antworten:


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

62
Ein Tipp: Geben Sie immer DateTime.Noweine Variable ein und verwenden Sie diese, wenn Sie den Wert wiederholt verwenden möchten. Es besteht eine geringe Wahrscheinlichkeit eines Fehlers, wenn dieser Code genau gegen Mitternacht ausgeführt wird. Die beiden Anrufe DateTime.Nowkönnen auf jeder Seite von Mitternacht erfolgen und möglicherweise seltsame Effekte verursachen.
Fredrik Mörk

Guter Punkt. Ich denke, Mitternacht am Silvesterabend ist die Zeit, in der dies möglicherweise zu Problemen führen wird.
Nick Jones

1
Nicht nur Neujahr. Es wäre ein Problem um Mitternacht am letzten Tag eines Monats. In jedem Fall wäre es nur dann ein Problem, wenn es am Monatsende in genau dieser Nanosekunde Mitternacht ausgeführt würde. Aber da Sie Ihren Code repariert haben, ist jetzt alles gut.
Doug S

1
Warum verwenden Sie "var" anstelle von "DateTime"?
markthewizard1234

4
@ markthewizard1234 hauptsächlich, weil C # -Programmierer faul sind. Deshalb verwenden wir nach Möglichkeit nur var, da es sich nur um drei Zeichen handelt. Es gibt andere Gründe, aber ich denke, dies ist der Hauptgrund für die meisten Menschen, dies zu tun.
Tim Pohlmann

41

So etwas würde funktionieren

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

4
Wie Fredrik Mork die Antwort von Nick Jones kommentierte, ist es am besten, die Datetime in einer Variablen zu speichern, wenn Sie sie mehrmals verwenden, um am letzten Tag des Monats gegen Mitternacht keine Probleme zu garantieren. Also: 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
Dies ist besser, da die Zeitzone beibehalten wird.
Rosdi Kasim

8

Ein bisschen spät zur Party, aber hier ist eine Erweiterungsmethode, die den Trick für mich getan hat

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

1
Das Problem dabei ist, dass die ursprüngliche Zeitzone nicht beibehalten wird.
Mike Cole

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

Sie können alles andere als DateTime.Now verwenden


2

Ich habe gerade einige Erweiterungsmethoden basierend auf der Antwort von Nick und andere auf der SO erstellt

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

Dies sollte effizient und korrekt sein:

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

Hier wird ticks / TimeSpan.TicksPerDaydie Anzahl der vollen Tage bis zur angegebenen zurückgegeben timeund - time.Day + 1diese Anzahl auf den Monatsanfang zurückgesetzt.


0

Hoffe das hilft dir.

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


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

3
Dies ist ein ziemliches Duplikat von Fubos Antwort, meinst du nicht auch?
Thomas Ayoub

2
Obwohl dieser Code das Problem möglicherweise löst, wird immer empfohlen, eine Erklärung hinzuzufügen, in der erläutert wird, warum / wie er funktioniert.
BDL

@ThomasAyoub - Nein, dies ist kein Duplikat von Fubos Antwort, da dies nicht den Zeitportain enthält.
Jay Shah

@ BDL - Ich denke, es ist sehr einfach zu verstehen, was keiner Erklärung bedarf. Aber zu Ihrer Information, ich habe das aktuelle Utc-Datum genommen und dann (Tage des aktuellen Datums - 1) davon abgezogen, um das Startdatum des Monats zu erhalten, dh 1 (nicht 0, und deshalb habe ich 1 abgezogen). Und ja, das wird das Problem definitiv lösen.
Jay Shah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.