tl; dr
LocalDate today = LocalDate.now(ZoneId.of("America/Montreal")) ;
Boolean isBetween =
(! today.isBefore(localDate1)) // “not-before” is short for “is-equal-to or later-than”.
&&
today.isBefore(localDate3) ;
albo lepiej, jeśli dodać ThreeTen-Extra bibliotekę do projektu.
LocalDateRange.of(
LocalDate.of(…) ,
LocalDate.of(…)
).contains(
LocalDate.now()
)
podejście pół-otwartych, gdzie początek jest integracyjnego natomiast zakończenie jest wyłącznym.
zły wybór formatu
przy okazji, że jest to zły wybór formatu reprezentacji tekstowej daty lub wartości daty i czasu. Jeśli to możliwe, trzymaj się standardowych formatów ISO 8601. Formaty ISO 8601 są jednoznaczne, zrozumiałe dla kultur ludzkich i łatwe do analizy przez maszynę.
W przypadku wartości tylko dla daty standardowym formatem jest RRRR-MM-DD. Zwróć uwagę, że ten format ma tę zaletę, że jest chronologiczny w kolejności alfabetycznej.
LocalDate
Klasa LocalDate
reprezentuje wartość data-tylko bez time-of-day i bez strefy czasowej.
Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W danym momencie data zmienia się na całym świecie według strefy. Na przykład kilka minut po północy w Paris France jest nowy dzień, a jednocześnie "wczoraj" w Montréal Québec.
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DateTimeFormatter
Jak struny wejściowe są w formacie niestandardowym, musimy określić wzór formatowania dopasować.
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MM-uuuu");
Służy do analizowania ciągów wejściowych.
LocalDate start = LocalDate.parse("22-02-2010" , f);
LocalDate stop = LocalDate.parse("25-12-2010" , f);
W pracy daty i czasu, zazwyczaj najlepiej zdefiniować przedział czasu od podejścia półotwartych, gdzie początek jest włącznie natomiast zakończenie jest wyłącznym. Chcemy więc wiedzieć, czy dzisiaj jest to samo, czy później niż początek, a także przed przystankiem. Krótszy sposób powiedzenia "jest taki sam lub późniejszy niż początek" to "nie przed startem".
Boolean intervalContainsToday = (! today.isBefore(start)) && today.isBefore(stop) ;
Zobacz listę metod porównywania, z którymi możesz się połączyć.
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują kłopotliwe stare klasy z datami, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Gdzie można uzyskać lekcje java.time?
- Java SE 8 i SE 9 a później
- wbudowanej.
- Część standardowego interfejsu API języka Java z pakietem implementacji.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
AKTUALIZACJA: Ta sekcja "Joda-Time" poniżej pozostaje nienaruszona jako historia. Projekt Joda-Time, teraz w maintenance mode, doradza migrację do java.time klas.
Joda-Time
Inne odpowiedzi są prawidłowe w odniesieniu do klas wiązanych java.util.Date i java.util.Calendar. Ale te zajęcia są notorycznie kłopotliwe. Więc oto kilka przykładów kodu przy użyciu biblioteki Joda-Time 2.3.
Jeśli naprawdę chcesz mieć datę bez części czasu i bez strefy czasowej, użyj klasy LocalDate
w Joda-Time. Że klasa udostępnia metody porównania w tym compareTo
(używane z Java Comparators), isBefore
, isAfter
i isEqual
.
Wejścia ...
String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";
Definiowanie formatowania opisywaniu ciągów wejściowych ...
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");
Zastosowanie formater do analizowania ciągów w LOCALDATE obiektów ...
LocalDate localDate1 = formatter.parseLocalDate(string1);
LocalDate localDate2 = formatter.parseLocalDate(string2);
LocalDate localDate3 = formatter.parseLocalDate(string3);
boolean is1After2 = localDate1.isAfter(localDate2);
boolean is2Before3 = localDate2.isBefore(localDate3);
Dump pocieszyć ...
System.out.println("Dates: " + localDate1 + " " + localDate2 + " " + localDate3);
System.out.println("is1After2 " + is1After2);
System.out.println("is2Before3 " + is2Before3);
Po uruchomieniu ...
Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true
więc sprawdzić, czy drugi jest między dwa pozostałe (nie wyłącznie, czyli równa albo końcowym) ...
boolean is2Between1And3 = ((localDate2.isAfter(localDate1)) && (localDate2.isBefore(localDate3)));
Praca z przęseł Czas
Jeśli pracujesz z biegiem czasu, proponuję zbadanie w Joda-Time klas: Duration, Interval i Period. Metody takie jak overlap
i contains
ułatwiają porównywanie.
Dla reprezentacji tekstowych, spójrz na standardowej za ISO 8601:
- duration
format: PnYnMnDTnHnMnS
Przykład: P3Y6M4DT12H30M5S
(czyli „trzy lata, sześć miesięcy, cztery dni dwanaście godzin, trzydzieści minut, a pięć sekund”)
- interval
Format: start/koniec
przykład: 2007-03-01T13: 00: 00S/2008-05-11T15: 30: 00Z
Klasy Joda-Time mogą pracować z łańcuchami w obu tych formatach, zarówno jako dane wejściowe (parsowanie), jak i wyjściowe (generujące łańcuchy znaków).
Joda-Time dokonuje porównań z wykorzystaniem półotwartych podejście gdzie początek rozpiętości jest włącznie natomiast zakończenie jest wyłącznym. Takie podejście jest mądre w radzeniu sobie z rozpiętością czasu. Wyszukaj StackOverflow, aby uzyskać więcej informacji.
Czy to włącznie, lub wyłącznie dla granic? –
@ DanielHári no its not inclusive. możesz użyć rozwiązania sugerowanego w pierwszym komentarzu lub użyj polecenia CompareTo()> = 0. – Mifmif
Normalny zwykle "lewy włącznie, prawy wyłączny", dlatego uważam, że należy to dokładnie określić. Dzięki ramkom "left inclusive, right exclusive" możesz łatwo określić: miesiąc interwał: [2016/04/01, 2016/05/01], dlatego jest to normalne i używane jako domyślne w wielu przypadkach użycia. –