Mam problem ze zresetowaniem godzin w Javie. Na dany dzień chcę ustawić godziny na 00:00:00.
To jest mój kod:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
Problem polega na tym, że czasami jest czas, 12:00:00
a czasami tak jest, 00:00:00
a kiedy wykonuję zapytanie w bazie danych o jednostkę, która została zapisana, 07.02.2013 00:00:00
a rzeczywisty czas jednostki, który jest przechowywany, 12:00:00
kończy się niepowodzeniem.
Wiem to 12:00:00 == 00:00:00
!
Używam AppEngine. Czy to błąd, problem z aplikacją lub inny problem? A może zależy to od czegoś innego?
java
java.util.calendar
Adelin
źródło
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Java 8 i Java 9. Zobacz samouczek Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
, w moim celu, działa dobrze.Odpowiedzi:
Użyj innej stałej zamiast
Calendar.HOUR
, użyjCalendar.HOUR_OF_DAY
.Calendar.HOUR
używa 0-11 (do użytku z AM / PM) iCalendar.HOUR_OF_DAY
używa 0-23.Cytując Javadocs:
i
Testowanie („teraz” to obecnie około 14:55, 23 lipca 2013 r. Czasu pacyficznego letniego):
Wynik:
źródło
Calendar.HOUR
nie ustawiłoby PM na AM, pozostawiając to na 12:00.java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Java 8 i Java 9. Zobacz samouczek Oracle .java.time
Korzystanie z
java.time
frameworka wbudowanego w Javę 8 i nowszych. Zobacz samouczek .Jeśli nie potrzebujesz części dotyczącej pory dnia (godziny, minuty, sekundy itp.), Rozważ użycie
LocalDate
klasy.źródło
LocalDateTime
jest dokładnie niewłaściwą klasą do tego celu. Nie może przedstawiać momentu, ponieważ nie ma pojęcia strefy czasowej ani przesunięcia względem UTC. DzwonienieLocalDateTime.now
prawie nigdy nie ma sensu. UżyjZonedDateTime
zamiast tego. W przeciwnym razie ignorujesz kluczowe problemy ze strefą czasową. Po pierwsze, niektóre daty w niektórych strefach nie zaczynają się o 00:00!Oto kilka funkcji narzędziowych, których używam do tego.
źródło
Jeszcze jeden sposób na JAVA 8:
Ale o wiele bardziej przydatne jest edytowanie daty, która już istnieje.
źródło
LocalDateTime
nie może przedstawiać chwili, ponieważ brakuje w niej koncepcji strefy czasowej lub przesunięcia względem UTC. DzwonienieLocalDateTime.now
prawie nigdy nie ma sensu. Zamiast tego powinieneś używaćZonedDateTime
.Lepiej byłoby ustawić strefę czasową przede wszystkim na składnik DateFormat w następujący sposób:
Następnie możesz uzyskać czas „00:00:00”, przekazując 0 milisekund do programu formatującego:
lub możesz stworzyć obiekt Date:
lub możesz mieć więcej możliwości przy użyciu komponentu Kalendarz, ale powinieneś również ustawić strefę czasową jako GMT dla wystąpienia kalendarza:
źródło
tl; dr
java.time
Używasz okropnych starych klas daty i czasu, które lata temu zostały wyparte przez nowoczesne klasy java.time zdefiniowane w JSR 310.
Date
➙Instant
A
java.util.Date
reprezentują chwilę w UTC. Jego zamiennikiem jestInstant
. Wywołaj nowe metody konwersji dodane do starych klas.Strefa czasowa
Określ strefę czasową, w której ma mieć sens nowa pora dnia.
Określ prawidłową nazwę strefy czasowej w formacie
Continent/Region
, takie jakAmerica/Montreal
,Africa/Casablanca
lubPacific/Auckland
. Nigdy nie używaj skrótów składających się z 2-4 liter, takich jakEST
lub,IST
ponieważ nie są to prawdziwe strefy czasowe, nie są standaryzowane, a nawet nie są unikalne (!).ZonedDateTime
Zastosuj
ZoneId
do,Instant
aby uzyskaćZonedDateTime
. Ten sam moment, ten sam punkt na osi czasu, ale inny zegar ścienny.Zmiana pory dnia
Poprosiłeś o zmianę pory dnia. Zastosuj a,
LocalTime
aby zmienić wszystkie części dotyczące pory dnia: godzina, minuta, sekunda, ułamek sekundy.ZonedDateTime
Tworzony jest nowy egzemplarz z wartościami opartymi na oryginale. W java.time klas użyć tej niezmiennej obiektów wzór, aby zapewnić wątku bezpieczeństwa .Pierwsza chwila dnia
Ale prosiłeś specjalnie o 00:00. Więc najwyraźniej chcesz pierwszej chwili dnia. Uwaga: niektóre dni w niektórych strefach nie zaczynają się o 00:00:00. Mogą rozpocząć się w innym czasie, na przykład 01:00:00 z powodu anomalii, takich jak czas letni (DST).
Niech java.time określi pierwszy moment. Wyodrębnij część zawierającą tylko datę. Następnie przejdź przez strefę czasową, aby uzyskać pierwszą chwilę.
Dostosuj do UTC
Jeśli chcesz wrócić do UTC, wyodrębnij plik
Instant
.Instant
➙Date
Jeśli potrzebujesz
java.util.Date
współdziałać ze starym kodem, który nie został jeszcze zaktualizowany do java.time , przekonwertuj.źródło
Może to być łatwiejsze (w Javie 8)
źródło
Możemy ustawić część czasu java.util.Date na 00:00:00 Używając klasy LocalDate api Java 8 / Joda-datetime :
źródło
Jeśli potrzebujesz formatu 00:00:00 w ciągu, powinieneś użyć SimpleDateFormat, jak poniżej. Używanie „H” zamiast „h”.
źródło
Innym sposobem na zrobienie tego byłoby użycie DateFormat bez żadnych sekund:
źródło
Możesz to zrobić w następujący sposób:
źródło
Ponieważ Java8 dodaje nowe funkcje Date, możemy to łatwo zrobić.
źródło
LocalDateTime
nie może przedstawiać chwili, ponieważ brakuje w niej koncepcji strefy czasowej lub przesunięcia względem UTC. DzwonienieLocalDateTime.now
prawie nigdy nie ma sensu. Zamiast tego powinieneś używaćZonedDateTime
.