Patrzę na Clock klasa Z Java, aby mogła go wstrzyknąć jako zależność od lepszej sprawności. Ale nie rozumiem różnicy między dwiema metodami systemUTC i systemDefaultZone. Wydaje się, że Instant.now() wydaje się wewnętrznie przy użyciu zegara systemUTC, podczas gdy YearMonth.now() używa zegara systemDefaultZone. Czytałem już Javadoc, ale nie było dla mnie bardzo jasne.

Mam kod, który używa Instant.now() i YearMonth.now() i chciałby zrozumieć różnicę między dwoma zegarów z kilkoma przykładami, w których korzystanie z każdego zegara błędnie może prowadzić do problemu.

4
Can't Tell 29 lipiec 2020, 10:20

1 odpowiedź

Najlepsza odpowiedź

Jeśli chodzi o metodę instant z dwóch zegarów zwróconych przez Clock.systemUTC i Clock.systemDefaultZone, zrobią to samo. Oba ich dokumentacja mówi, że zegary są "oparte na najlepszym dostępnym zegara systemu". Tak więc tworzenie Instant s Korzystanie zegarów zawsze daje ci tę samą chwilę.

Różnica w zachowaniu przychodzi, gdy próbujesz utworzyć datę lub godzinę. systemUTC Czy to:

Konwersja z natychmiastowej do daty lub czasu używa strefy czasowej UTC.

Mając na uwadze, że systemDefaultZone robi to:

Konwersja do daty i godziny za pomocą domyślnej strefy czasowej.

Więc chociaż oba zwrócą taką samą chwilę, jeśli poprosisz ich, czym jest aktualna chwila, niekoniecznie niekoniecznie zwrócili to samo LocalDateTime, lub ZonedDateTime lub ZonedDateTime. Załóżmy na przykład, że mój system czasowy jest Asia/Shanghai, który znajduje się na przesunięciu UTC + 8 przez cały rok. I jest teraz 5 rano 2020-07-29 w Szanghaju. Jeśli to zrobię LocalDate.now(Clock.systemUTC()), powie mi 2020-07-28, ponieważ wciąż jest 28. w strefie czasowej UTC. Jeśli jednak zrobię LocalDate.now(Clock.systemDefaultZone()), jednak powie mi 2020-07-29, ponieważ jest to 2020-07-29 w Szanghaju (który jest czasowy czasowy).

Teraz powinieneś zobaczyć, dlaczego parametryczny now klas związanych z datą / czasami używa systemDefaultZone. Byłoby dziwne, gdybym zrobił LocalTime.now() w Szanghaju i zobaczyłem czas, który jest 8 godzin wcześniej!

6
Sweeper 9 luty 2021, 06:28