Получение миллисекунд от date.getTime () на уровне API Android 19 - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно получить строку даты и времени в формате

"yyyy-MM-dd'T'HH:mm:ss.SSSZ"

, где SSS - цифры для миллисекунд (от 000 до 999).

Я написал следующий фрагмент кода:

Date date=Calendar.getInstance().getTime();
String currentDateTimeString = (String) android.text.format.DateFormat.
       format("yyyy-MM-dd'T'HH:mm:ss.SSSZ",Calendar.getInstance().getTime());

но я получаю строки типа

"2019-11-08T13: 39: 33.SSSZ"

из-за некоторых проблем, описанных в этом ответе

https://stackoverflow.com/a/58768066/930835

Этот ответ принят из-за предоставленной им информации. Предложение не применимо к моему случаю.

Действительно, мое приложение должно быть совместимо с уровнем API Android 19.

Кстати, этот вопрос требует оценки конкретного фрагмента кода.

Это отдельный фрагмент кода. Так что это другой вопрос, полезный сам по себе.

Итак, я попробовал этот код

Date date=Calendar.getInstance().getTime();
    String currentDateTimeString = (String) android.text.format.DateFormat.
           format("yyyy-MM-dd'T'HH:mm:ss",date);
    long ms=date.getTime() %1000;
    currentDateTimeString=currentDateTimeString+"."+String.valueOf(ms)+"Z";

, но я не знаю, надежен ли он, то есть рассчитывает ли он миллисекундыэта дата мгновенно правильно.

1 Ответ

2 голосов
/ 09 ноября 2019

java.time и ThreeTenABP

Для Android API уровня 19 Я предлагаю вам использовать java.time через бэкпорт, ThreeTenABP.

Простая версия:

    String currentDateTimeString = Instant.now().toString();
    System.out.println(currentDateTimeString);

Вывод при работе только сейчас:

2019-11-08T21: 43: 31.893Z

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

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");
    String currentDateTimeString
            = OffsetDateTime.now(ZoneOffset.UTC).format(formatter);

2019-11-08T21: 48: 10.262Z

Будет ли код в вопросенадежный?

но я не знаю, надежно ли он, то есть правильно ли он вычисляет миллисекунды этой даты.

Нет, ваш код не былдовольно надежныйДве точки:

  1. Если милисекунды меньше 100, они будут напечатаны менее чем из 3 цифр. 58,012 секунды будут неправильно напечатаны как 58,12 секунды. Я согласен с вашим комментарием, что решение этой проблемы может быть найдено.
  2. Гораздо хуже, но не связано с миллисекундами: ваш код печатает дату и время в часовом поясе JVM по умолчанию (вероятно, время устройстванастройка зоны), но добавляет Z, утверждая, что время указано в UTC, а это не так (если только для данного конкретного устройства не установлено значение UTC, но даже если бы оно было, вы не должны полагаться на этовсегда). Я не знаю android.text.format.DateFormat достаточно хорошо, чтобы сказать, предлагает ли он какое-либо решение этой проблемы.

Вопрос: Разве java.time не требует Android API уровня 26?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Для этого требуется как минимум Java 6 .

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

Ссылки

...