Nie mogę wymyślić łatwego jednego lub dwóch wkładek, które dostałyby poprzednie miesiące pierwszego i ostatniego dnia.
Jestem LINQ-ifying ankietową aplikację internetową i wycisnęli nowe wymaganie w.
Ankieta musi obejmować wszystkie zgłoszenia serwisowe z poprzedniego miesiąca. Więc jeśli jest 15 kwietnia, potrzebuję wszystkich identyfikatorów żądań Marchii.
var RequestIds = (from r in rdc.request
where r.dteCreated >= LastMonthsFirstDate &&
r.dteCreated <= LastMonthsLastDate
select r.intRequestId);
Po prostu nie mogę łatwo wymyślić dat bez przełącznika. Chyba że jestem ślepy i nie dostrzegam wewnętrznej metody robienia tego.
Sposób, w jaki robiłem to w przeszłości, to pierwszy dzień tego miesiąca
Następnie odejmij dzień, aby otrzymać koniec ostatniego miesiąca
Następnie odejmij miesiąc, aby otrzymać pierwszy dzień poprzedniego miesiąca
źródło
return date.AddDays(-(date.Day-1))
areturn new DateTime(date.Year, date.Month, 1);
wydajność pierwszych ponad 2000 iteracji jest lepsza (nowe 923 ms w porównaniu z 809 ms zwracaniem tego samego obiektu)przy użyciu Fluent DateTime https://github.com/FluentDateTime/FluentDateTime
źródło
źródło
Używam tego prostego, jednowierszowego:
Miej świadomość, że zachowuje czas.
źródło
Podejście wykorzystujące metody rozszerzające:
Zobacz ten link http://www.codeplex.com/fluentdatetime, aby uzyskać kilka inspirowanych rozszerzeń DateTime.
źródło
Kanoniczny przypadek użycia w handlu elektronicznym to daty ważności kart kredytowych, MM / rr. Odejmij jedną sekundę zamiast jednego dnia. W przeciwnym razie karta będzie wydawać się wygasła na cały ostatni dzień miesiąca wygaśnięcia.
źródło
Jeśli jest jakakolwiek szansa, że Twoje daty nie są ścisłymi datami kalendarzowymi, powinieneś rozważyć skorzystanie z porównań wykluczeń z dat końcowych ... Dzięki temu nie przegapisz żadnych żądań utworzonych w dniu 31 stycznia.
źródło
źródło
Oto odpowiedź na odpowiedź Mike'a W.
Możesz to tak nazwać:
źródło