LocalDateTime.now () имеет разные уровни точности на компьютерах с Windows и Mac - PullRequest
0 голосов
/ 26 августа 2018

При создании нового LocalDateTime с использованием LocalDateTime.now() на моем компьютере Mac и Windows я получаю точность nano 6 на моем Mac и точность nano 3 на моем Windows машина. Оба работают jdk-1.8.0-172.

  • Можно ли ограничить или увеличить точность на одном из машины?
  • А почему точность на самом деле отличается?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Точность отличается тем, что LocalDateTime.now() использует системное значение по умолчанию Clock.

Получает текущую дату и время из системных часовв часовом поясе по умолчанию.

Это запросит системные часы в часовом поясе по умолчанию, чтобы получить текущую дату и время.

...

Ссылка в этом Javadoc приведет вас к Clock.systemDefaultZone(), в котором говорится ( выделение мое):

Получает часы, которые возвращают текущий момент с использованием наилучших доступных системных часов, преобразовывая их в дату и время с использованием часового пояса по умолчанию.

Эти часы основаны на лучших доступных системных часах. Может использоваться System.currentTimeMillis () или часы с более высоким разрешением, если они доступны.

...

КакиеЧасы, которые использует Java, могут зависеть от многих вещей, и похоже, что у вашего компьютера Mac есть часы с точностью микро секунды, тогда как у вашего компьютера с Windows есть часы с точностью милли секунды.Я не знаю ни одного способа увеличить точность часов, но вы определенно можете уменьшить точность, чтобы она соответствовала на разных платформах.

Один из вариантов -сделать как Оле В.В. в своем ответе и использовать LocalDateTime.truncatedTo(TemporalUnit).

Другой вариант - подключить свой собственный Clock и использовать LocalDateTime.now(Clock).Если возможно, я бы использовал Clock.tickMillis(ZoneId), так как этот метод возвращает Clock, который усекается до миллисекунд.

Получает часы, которые возвращают текущий мгновенный тик в полных миллисекундах, используялучшие из доступных системных часов.

Эти часы всегда будут иметь поле нано секунды, обрезанное до миллисекунд.Это гарантирует, что видимое время тикает в целых миллисекундах.Базовые часы являются лучшими доступными системными часами, эквивалентными использованию system (ZoneId).

...

С:
9

0 голосов
/ 26 августа 2018

Я не думаю, что вы можете получить лучшую точность, чем та, которую вы уже получаете.Если вы хотите уменьшить точность, чтобы соответствовать точности другой системы, это просто (если вы знаете, как):

LocalDateTime.now(ZoneId.of("Europe/Berlin")).truncatedTo(ChronoUnit.MILLIS);

Точность, которую вы получаете, зависит от аппаратного обеспечения, настроек, ОС и интеграцииJVM со всеми этими.Хорошо известно, что Mac, как правило, обеспечивает лучшую точность, чем Windows (хотя у меня сложилось впечатление, что это было только в случае Java 9, согласно проблеме OpenJDK # JDK ‑ 8068730 ).

...