встановити DateTime для початку місяця


97

Як я можу встановити DateTime для першого числа місяця в C #?


початок поточного місяця?
Phil Gan

1
так що з цим отримати, .. дата кожного місяця починається з 1 ... чи він хоче знати День на початку Місяця
Shekhar_Pro

Якщо ми знаходимося в січні, це повинно відображатись 01 січня 2011 р. І в лютому, потім 01 лютого 2011 р.
навчання

ви можете подивитися в це
V4Vendetta

Відповіді:


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

62
Порада: завжди вводьте DateTime.Nowзмінну і використовуйте це, якщо ви збираєтеся використовувати значення неодноразово. Існує невелика ймовірність помилки, якщо цей код буде виконаний рівно близько півночі; два дзвінки DateTime.Nowможуть відбуватися з кожного боку опівночі, що може спричинити дивні наслідки.
Fredrik Mörk

Гарна думка. Я думаю, що опівночі напередодні Нового року - це час, який потенційно може спричинити проблему.
Нік Джонс

1
Не тільки новорічні. Це була б проблема опівночі останнього дня будь-якого місяця. У будь-якому випадку, це буде проблемою лише в тому випадку, якщо вона буде виконана тієї самої наносекунди опівночі наприкінці місяця. Але оскільки ви виправили свій код, зараз все добре.
Doug S

1
чому ви використовуєте "var" замість "DateTime"?
markthewizard1234

4
@ markthewizard1234 головним чином тому, що програмісти на C # ледачі. Отже, ми просто використовуємо var, коли це можливо, оскільки це всього три символи. Є й інші причини, але я вважаю, що це основна причина для більшості людей це робити.
Тім Полманн

41

Щось подібне спрацювало б

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

4
Як прокоментував відповідь Ніка Джонса Фредрік Морк, найкраще зберігати Datetime у змінній, коли ви використовуєте його кілька разів, щоб гарантувати відсутність проблем близько півночі останнього дня місяця. Отже: DateTime сьогодні = DateTime.Today; DateTime firstDay = сьогодні.AddDays (1-today.Day);
Doug S

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

1
Це краще, оскільки він зберігає часовий пояс.
Росді Касім

8

Трохи пізно на вечірку, але ось метод розширення, який зробив для мене фокус

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

1
Проблема в тому, що він не зберігає початковий часовий пояс.
Mike Cole

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

Ви можете використовувати будь-що інше замість DateTime.Now


2

Я просто створив деякі методи розширення на основі відповіді Ніка та інші на 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

Це має бути ефективно та правильно:

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

Тут ticks / TimeSpan.TicksPerDayповертається кількість повних днів до заданого timeі - time.Day + 1скидається до початку місяця.



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

3
Це цілком дублікат відповіді Фубо, вам не здається?
Thomas Ayoub

2
Хоча цей код може вирішити проблему, завжди рекомендується додати пояснення, що пояснює, чому / як він працює до нього.
BDL,

@ThomasAyoub - Ні, це не є цілком дублікатом відповіді Фубо, оскільки вона не буде містити часовий портен.
Джей Шах,

@BDL - Я думаю, це дуже просто зрозуміти, що не вимагає пояснень. Але FYI, я взяв поточну дату Utc, а потім відняв (Дні поточної дати - 1) з неї, щоб отримати дату початку місяця, тобто 1 (а не 0, тому я відняв 1). І так, це точно вирішить проблему.
Джей Шах,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.