ZoneId zone = ZoneId.of("Europe/Guernsey"); // Specify a time zone by proper name `Contintent/Region`, never by 3-4 letter codes such as `PST`, `CST`, or `IST`.
LocalDate then = // Represent a date-only value, without time zone and without time-of-day.
Instant.ofEpochMilli(1_512_431_637_067L) // Parse your number of milliseconds since 1970-01-01T00:00Z as a value in UTC.
.atZone(zone) // Adjust from UTC to some other zone. Same moment, different wall-clock time. Returns a `ZonedDateTime`.
.toLocalDate(); // Extract a date-only value.
LocalDate today = LocalDate.now(zone); // Get the current date as seen in the wall-clock time in use by the people of a particular region.
Period diff = Period.between(then, today); // Determine the number of years-months-days elapsed.
System.out.println(diff); // Generate a String is standard ISO 8601 format: `PnYnMnDTnHnMnS`.
Вывод при запуске только сейчас именно то, что вы просили:
P5M4D
Результат зависит от часового пояса. В любой момент времени дата меняется по всему земному шару в зависимости от зоны.
Поэтому, пожалуйста, замените желаемый часовой пояс, если он не был Europe/Guernsey
. Используйте ZoneOffset.UTC
и OffsetDateTime
класс, если вы хотите, чтобы вычисление происходило в UTC .
Например, выполнение указанного выше кода для Europe/Guernsey
приводит к P5M4D, а переключение на Europe/Moscow
приводит к P5M3D, с разницей в один день в зависимости от того, какую зону вы указали.
Period.between(then, LocalDate.now(ZoneId.of("Europe/Moscow")))
Вывод в день, когда был задан вопрос:
P5M3D
Для продолжительности, включающей в себя единицы, превышающие день, вам необходимо использовать Period
класс java.time
Duration
класс предназначен для небольших единиц, дней- часы-минуты-секунды-наносекунд.