Преобразование прошедшего времени между временем эпохи и текущим моментом в продолжительность ISO 8601 с помощью Java - PullRequest
0 голосов
/ 08 мая 2018

У меня миллисекунды с 1970 года 1 UTC (время эпохи).

1512431637067

Мне нужно преобразовать это в что-то вроде (продолжительность ISO-8601). Это будет основано на текущей сегодняшней дате.

P5M4D

Есть идеи, как сделать это простым способом, используя код Java?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Строго говоря, вы не можете, потому что так называемое «время эпохи» - это действительно мгновение, а НЕ длительность.Но вы можете захотеть смоделировать прошедшее с той эпохи (эпоха Unix) время как продолжительность.Итак, начнем:

System.out.println(Duration.of(1512431637067L, ChronoUnit.MILLIS));
// output: PT420119H53M57.067S

Метод java.time.Duration.toString() автоматически нормализует секунды и наносекунды в формате HMS (в противном случае мы должны заявить, что возможности печати нового класса продолжительности ограничены).Если вы хотите большего контроля над форматом ISO, тогда либо подумайте о собственном обходном пути, используя такие методы, как toHours() и т. Д., Либо используйте стороннюю библиотеку для длительной печати. ​​

Еще одна вещь: 1512431637067, кажется, в миллисекундахне в секундах, как вы заявили, иначе вы получите мгновение в далеком будущем:

System.out.println(Instant.ofEpochMilli(1512431637067L));
// output: 2017-12-04T23:53:57.067Z

System.out.println(Instant.ofEpochSecond(1512431637067L));
// far future: +49897-01-18T19:11:07Z
0 голосов
/ 08 мая 2018
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 класс предназначен для небольших единиц, дней- часы-минуты-секунды-наносекунд.

0 голосов
/ 08 мая 2018

попробуйте эту строку

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Locale;

public class HelloWorld
{
  public static void main(String[] args)
  {
    Date date=new Date (1512431637067L);
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);
    System.out.print(df.format(date));
  }
}

дата выхода на ISO 8601:

2017-12-04T23:53:57.067Z

...