Chcę uzyskać pierwszy dzień i ostatni dzień miesiąca, w którym znajduje się dana data. Data pochodzi z wartości w polu interfejsu użytkownika.
Jeśli używam próbnika czasu, mogę powiedzieć
var maxDay = dtpAttendance.MaxDate.Day;
Ale próbuję uzyskać go z obiektu DateTime. Więc jeśli mam to ...
DateTime dt = DateTime.today;
Jak zdobyć pierwszy dzień i ostatni dzień miesiąca dt
?
_Date
. Jakie „min i maks” próbujesz uzyskać z tej wartości?Odpowiedzi:
DateTime
struktura przechowuje tylko jedną wartość, a nie zakres wartości.MinValue
iMaxValue
są polami statycznymi, które zawierają zakres możliwych wartości dla instancjiDateTime
konstrukcji. Te pola są statyczne i nie odnoszą się do konkretnego wystąpieniaDateTime
. Dotyczą oneDateTime
samego pisania.Sugerowana lektura: statyczna (C # Odniesienie)
AKTUALIZACJA: Pobieranie zakresu miesięcy:
źródło
lastDayofMonth
byćfirstDayOfMonth.AddMonths(1).AddSeconds(-1);
?AddTicks(-1)
, ale jeśli nie dbamy o część czasu i myślimy tylko o części, to dni będą w porządku< firstDayOfNextMonth
zamiast<= lastDayOfMonth
. W ten sposób zawsze będzie działać bez względu na szczegółowość. (Jestem pewien, że kleszcze będą w porządku, ale kto wie, co przyniesie przyszłość ... nanotiksy?)To bardziej długi komentarz do odpowiedzi @Sergey i @ Steffen. Po napisaniu podobnego kodu w przeszłości postanowiłem sprawdzić, co było najbardziej wydajne , pamiętając jednocześnie o tym, że jasność jest ważna.
Wynik
Oto przykładowy przebieg testu dla 10 milionów iteracji:
Kod
Użyłem LINQPada 4 (w trybie programu C #) do uruchomienia testów z włączoną optymalizacją kompilatora. Oto przetestowany kod uwzględniony jako metody rozszerzenia dla przejrzystości i wygody:
Analiza
Byłem zaskoczony niektórymi z tych wyników.
Chociaż nie ma w nim wiele,
FirstDayOfMonth_AddMethod
było nieco szybciej niżFirstDayOfMonth_NewMethod
w większości przebiegów testu. Myślę jednak, że ten drugi cel jest nieco jaśniejszy i dlatego mam na to ochotę.LastDayOfMonth_AddMethod
było jasne, przegrany przedLastDayOfMonth_AddMethodWithDaysInMonth
,LastDayOfMonth_NewMethod
iLastDayOfMonth_NewMethodWithReuseOfExtMethod
. Między najszybszymi trzema nie ma w tym nic wielkiego, więc sprowadza się to do twoich osobistych preferencji. Wybieram przejrzystośćLastDayOfMonth_NewMethodWithReuseOfExtMethod
przy ponownym użyciu innej użytecznej metody rozszerzenia. IMHO jego cel jest wyraźniejszy i jestem gotów zaakceptować niewielki koszt wydajności.LastDayOfMonth_SpecialCase
zakłada się, że podajesz pierwszy dzień miesiąca w specjalnym przypadku, w którym być może już obliczyłeś tę datę, i używa metody add z,DateTime.DaysInMonth
aby uzyskać wynik. Jest to szybsze niż inne wersje, jak można się spodziewać, ale chyba, że jesteś w rozpaczliwej potrzebie szybkości, nie widzę sensu, aby mieć ten specjalny przypadek w twoim arsenale.Wniosek
Oto klasa metod rozszerzenia z moimi wyborami i ogólnie w zgodzie z @Steffen Wierzę:
Jeśli masz tak daleko, dziękuję za czas! Było fajnie: ¬). Proszę o komentarz, jeśli masz jakieś inne sugestie dotyczące tych algorytmów.
źródło
LastDayOfMonth_AddMethod_SpecialCase
(lub coś takiego). Spodziewając się pierwszego dnia miesiąca jako parametru, myślę, że najszybszym powinno być to, coLastDayOfMonth_AddMethod
robi! To byłoby tak proste, jak:return value.AddMonths(1).AddDays(-1);
Uzyskiwanie zakresu miesięcy za pomocą .Net API (po prostu inny sposób):
źródło
„
Last day of month
” to „First day of *next* month, minus 1
”. Oto, czego używam, bez potrzeby stosowania metody „DaysInMonth”:UWAGA: Powodem, którego używam
AddMinutes(-1)
, a nieAddDays(-1)
tutaj, jest to, że zwykle potrzebujesz tych funkcji daty do raportowania dla pewnego okresu, a kiedy tworzysz raport dla okresu, „data końcowa” powinna być podobna doOct 31 2015 23:59:59
tego, aby raport działał poprawnie - w tym wszystkie dane z ostatniego dnia miesiąca.To znaczy, że faktycznie dostajesz tutaj „ostatnią chwilę miesiąca”. Nie ostatni dzień.
OK, teraz się zamknę.
źródło
źródło
description
kodu, który pomoże wyjaśnić kod. DziękiTutaj możesz dodać jeden miesiąc dla pierwszego dnia bieżącego miesiąca, niż usunąć 1 dzień z tego dnia.
źródło
Jeśli zależy Ci tylko na dacie
Jeśli chcesz zaoszczędzić czas
źródło
Przyjęta tutaj odpowiedź nie uwzględnia rodzaju instancji DateTime. Na przykład, jeśli twoja oryginalna instancja DateTime była rodzajem UTC, to tworząc nową instancję DateTime, utworzysz instancję Nieznany rodzaj, która będzie następnie traktowana jako czas lokalny na podstawie ustawień serwera. Dlatego bardziej właściwym sposobem uzyskania pierwszej i ostatniej daty miesiąca będzie:
W ten sposób zachowany zostanie oryginalny rodzaj instancji DateTime.
źródło
Spróbuj tego:
źródło
Użyłem tego w swoim skrypcie (działa dla mnie), ale potrzebowałem pełnej daty bez potrzeby przycinania jej tylko do daty i bez godziny.
źródło
Spróbuj. Zasadniczo oblicza liczbę dni, które minęły
DateTime.Now
, a następnie odejmuje jeden od tego i używa nowej wartości do znalezienia pierwszego z bieżącego miesiąca. Stamtąd wykorzystuje toDateTime
i wykorzystuje,.AddMonths(-1)
aby uzyskać pierwszy z poprzedniego miesiąca.Uzyskiwanie ostatniego dnia poprzedniego miesiąca robi w zasadzie to samo, z tym wyjątkiem, że dodaje jeden do liczby dni w miesiącu i odejmuje tę wartość
DateTime.Now.AddDays
, dając ci ostatni dzień poprzedniego miesiąca.źródło
Dla kultury perskiej
źródło
Możesz to zrobić
źródło
łatwy sposób to zrobić
źródło
źródło