установить DateTime на начало месяца


97

Как установить DateTime на первое число месяца на C #?


начало текущего месяца?
— Фил Ган

1
Итак, что об этом, .. каждый месяц число начинается с 1 .. хочет ли он знать день в начале месяца
— Shekhar_Pro

Если мы находимся в январе, должно отображаться 01 января 2011 года, а затем - 1 февраля 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 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
Это лучше, поскольку он сохраняет часовой пояс.
— Росди Касим

8

Немного поздно на вечеринку, но вот метод расширения, который помог мне

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

1
Проблема в том, что он не сохраняет исходный часовой пояс.
— Майк Коул

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

2
Хотя этот код может решить проблему, всегда рекомендуется добавлять объяснение, объясняющее, почему и как это работает.
— BDL

@ThomasAyoub - Нет, это не полная копия ответа fubo, так как он не будет содержать порт времени.
— Джей Шах

@BDL - я думаю, это очень просто понять, что не требует пояснений. Но к вашему сведению, я взял текущую дату Utc, а затем вычел из нее (Дни текущей даты - 1), чтобы получить дату начала месяца, то есть 1 (а не 0, и поэтому я вычел 1). И да, это точно решит проблему.
— Джей Шах
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.