Wie kann ich in C # eine DateTime auf den ersten des Monats setzen?
Wie kann ich in C # eine DateTime auf den ersten des Monats setzen?
Antworten:
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);
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.
So etwas würde funktionieren
DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);
public static DateTime FirstDayOfMonth(this DateTime current)
{
return current.AddDays(1 - current.Day);
}
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);
}
}
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);
}
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.
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));