Instant.now эквивалентен java.util.Date или Java 7 - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть система, использующая Java 7, и мне нужно сгенерировать дату, эквивалентную Instant.now (Java 8).

Например, Instant.now().toString() сгенерировать такую ​​дату: "2018-12-19T12: 32: 46,816Z "

Использование java.util.Date У меня есть эта дата: " 2018-12-19T10: 38: 13,892 "

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat sdf;
    sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    String text = sdf.format(date);
    System.out.println(text);

Я не знаю, смогу ли я просто объединить "Z" в конце этой даты.

Без "Z" другой системы, котораяанализ этой даты с помощью Instant.parse выдает ошибку:

java.time.format.DateTimeParseException: текст '2018-12-19T10: 38: 13.892' не может быть проанализирован с индексом 23 в java.base / java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1988) в java.base / java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1890) в java.base / java.time.Instant.parse (Instant.java:395)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

ThreeTen Backport

java.time, современный Java-интерфейс даты и времени, перенесен в бэкпорт.Так что просто сделайте, как в Java 8:

    String text = Instant.now().toString();

Запуск только сейчас, я получил:

2018-12-19T13: 37: 37.186Z

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) встроен современный API.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпортновые классы (ThreeTen для JSR 310; см. ссылки внизу).
  • На старых версиях Android используется версия ThreeTen Backport для Android.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Устаревший SimpleDateFormat

Если вы не хотите полагаться на внешнюю зависимость, пока выперейти на Java 8 или выше, (наиболее) правильное решение - это комбинация частей из двух других ответов (один из них теперь удален):

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX");
    sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    String text = sdf.format(System.currentTimeMillis());

2018-12-19T13: 37: 37.285Z

Он не всегда дает ту же строку, что и Instant.toString, но дает строку, которую Instant может проанализировать в другой системе.В то время как Instant.toString() печатает только столько десятичных знаков, сколько необходимо, вышеприведенный SimpleDateFormat будет печатать три десятичных знака также, когда некоторые из них 0.

Когда часовой пояс форматировщика установлен в формате UTC, буква шаблона форматирования(верхний регистр) X будет печатать Z как «часовой пояс» (на самом деле просто смещение).

Ссылки

0 голосов
/ 19 декабря 2018

Z означает часовой пояс UTC , вы можете установить часовой пояс на UTC и добавить Z вручную:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
...