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.
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);
Właśnie stworzyłem kilka metod rozszerzających opartych na odpowiedzi Nicka, a inne na SO
publicstaticclassDateTimeExtensions{/// <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>publicstaticSystem.DateTimeStartOfWeek(thisSystem.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>publicstaticSystem.DateTimeStartOfMonth(thisSystem.DateTime dt)=>newSystem.DateTime(dt.Year, dt.Month,1);/// <summary>/// get datetime of the start of the year/// </summary>/// <param name="dt"></param>/// <returns></returns>publicstaticSystem.DateTimeStartOfYear(thisSystem.DateTime dt)=>newSystem.DateTime(dt.Year,1,1);}
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.
Odpowiedzi:
źródło
DateTime.Now
w 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 wezwaniaDateTime.Now
mogą wystąpić po obu stronach północy, powodując prawdopodobnie dziwne efekty.Coś takiego by zadziałało
źródło
źródło
Trochę za późno na imprezę, ale oto metoda przedłużenia, która załatwiła mi sprawę
źródło
Możesz użyć czegokolwiek innego zamiast DateTime.Now
źródło
Właśnie stworzyłem kilka metod rozszerzających opartych na odpowiedzi Nicka, a inne na SO
źródło
Powinno to być wydajne i poprawne:
Tutaj
ticks / TimeSpan.TicksPerDay
zwraca liczbę pełnych dni do podanejtime
i- time.Day + 1
resetuje tę liczbę do początku miesiąca.źródło
Mam nadzieję, że to ci pomoże.
textbox1.Text = "01-" + DateTime.Now.ToString ("MMM-yyyy");
źródło
źródło