ustaw DateTime na początek miesiąca

97

Jak ustawić DateTime na pierwszy dzień miesiąca w C #?

uczenie się
źródło
początek bieżącego miesiąca?
Phil Gan,
1
więc co z tym zrobić… data każdego miesiąca zaczyna się od 1… czy on chce znać dzień początku miesiąca
Shekhar_Pro,
Jeśli jesteśmy w styczniu, powinien pokazać się 01-styczeń-2011 i luty, a potem 01-luty-2011
nauka
można spojrzeć na to
V4Vendetta

Odpowiedzi:

204
var now = DateTime.Now;
var startOfMonth = new DateTime(now.Year,now.Month,1);
Nick Jones
źródło
62
Wskazówka: zawsze umieszczaj ją DateTime.Noww zmiennej i używaj jej, jeśli zamierzasz używać tej wartości wielokrotnie. Istnieje niewielka szansa na błąd, jeśli ten kod zostanie wykonany dokładnie około północy; dwa wezwania DateTime.Nowmogą wystąpić po obu stronach północy, powodując prawdopodobnie dziwne efekty.
Fredrik Mörk,
Słuszna uwaga. Myślę, że północ w wigilię Nowego Roku to czas, w którym może to spowodować problem.
Nick Jones,
1
Nie tylko Nowy Rok. Byłby problem o północy ostatniego dnia każdego miesiąca. W każdym razie byłby problem tylko wtedy, gdyby został wykonany tej samej nanosekundy o północy pod koniec miesiąca. Ale ponieważ naprawiłeś kod, teraz wszystko jest w porządku.
Doug S
1
dlaczego używasz „var” zamiast „DateTime”?
markthewizard1234
4
@ markthewizard1234 głównie dlatego, że programiści C # są leniwi. Więc używamy var, kiedy tylko jest to możliwe, ponieważ ma tylko trzy znaki. Są inne powody, ale wydaje mi się, że to jest główny powód, dla którego większość ludzi to robi.
Tim Pohlmann
41

Coś takiego by zadziałało

DateTime firstDay = DateTime.Today.AddDays(1 - DateTime.Today.Day);
V4Vendetta
źródło
4
Jak Fredrik Mork skomentował odpowiedź Nicka Jonesa, najlepiej przechowywać Datetime w zmiennej, gdy używasz jej wiele razy, aby zagwarantować, że nie będzie problemów około północy ostatniego dnia miesiąca. A więc: 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
źródło
1
Jest to lepsze, ponieważ utrzymuje strefę czasową.
Rosdi Kasim,
8

Trochę za późno na imprezę, ale oto metoda przedłużenia, która załatwiła mi sprawę

public static class DateTimeExtensions
{
  public static DateTime FirstDayOfMonth(this DateTime dt)
  {
    return new DateTime(dt.Year, dt.Month, 1);
  }
}
Colin Banbury
źródło
1
Problem polega na tym, że nie zachowuje oryginalnej strefy czasowej.
Mike Cole
2
DateTime now = DateTime.Now;
DateTime date = new DateTime(now.Year, now.Month, 1);

Możesz użyć czegokolwiek innego zamiast DateTime.Now

rotman
źródło
2

Właśnie stworzyłem kilka metod rozszerzających opartych na odpowiedzi Nicka, a inne na 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
źródło
0

Powinno to być wydajne i poprawne:

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

Tutaj ticks / TimeSpan.TicksPerDayzwraca liczbę pełnych dni do podanej timei - time.Day + 1resetuje tę liczbę do początku miesiąca.

nayato
źródło
0

Mam nadzieję, że to ci pomoże.

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

Ann Sara
źródło
-2
var currentDate = DateTime.UtcNow.Date;
var startDateTimeOfCurrentMonth = currentDate.AddDays(-(currentDate.Day - 1));
Jay Shah
źródło
3
Nie sądzisz, że to duplikat odpowiedzi fubo?
Thomas Ayoub,
2
Chociaż ten kod może rozwiązać problem, zawsze zaleca się dodanie wyjaśnienia wyjaśniającego, dlaczego / jak to działa.
BDL
@ThomasAyoub - Nie, to nie jest Dość duplikat odpowiedzi fubo, ponieważ nie będzie zawierała portu czasu.
Jay Shah,
@BDL - myślę, że jest to bardzo proste do zrozumienia, co nie wymaga wyjaśnienia. Ale do Twojej wiadomości, wziąłem bieżącą datę Utc, a następnie odjąłem od niej (dni bieżącej daty - 1), aby uzyskać datę początkową miesiąca, tj. 1 (nie 0 i dlatego odjęłem 1). I tak, to na pewno rozwiąże problem.
Jay Shah,