Сохранение метки времени в java - PullRequest
0 голосов
/ 23 января 2020

У меня есть строка ввода как 2020-01-21T02: 16: 51.8320Z

Мне нужно проанализировать эту строку в объект java Date.

Я попытался использовать следующие код.

LocalDate localDate = LocalDate.parse(date, flexUtcDtf);
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

Вывод: Ср 22 января 00:00:00 EST 2020

Возможно ли вместо этого получить выходные данные как следующий объект Date? (т.е. сохраняя также детали времени) Ср 21 января 02: 46: 51.8320 EST 2020

Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 января 2020
java.util.Date
.from(
    Instant.parse(
        "2020-01-21T02:16:51.8320Z"
    )
)
.toString()

Остерегайтесь потери данных. Ваш ввод имеет четвертое число git десятичной дроби секунды. Это означает, микросекунды. Класс Instant может справиться с этим. Но унаследованный класс Date, о котором вы просили, не может и ограничен миллисекундами. Таким образом, любые микросекунды будут обрезаны, обрезаны до миллисекунд.

Ужасные классы наследия, такие как java.util.Date, получили новых методов, облегчающих преобразование назад и вперед между современными java .time . Здесь мы используем Date.from( Instant ) для получения устаревшей даты из современной Instant, проанализированной из вашего ввода.

Остерегайтесь, что Date имеет много fl aws и проблем. Среди них поведение его toString метода. Этот метод принимает значение Date, которое является моментом в UT C, а затем применяет текущий часовой пояс JVM по умолчанию при генерации текста. Это создает иллюзию того, что этот часовой пояс является частью Date.

. Я предлагаю вам избегать Date полностью и использовать только java .time классы. Но мой код здесь отвечает на вопрос как задано.

Кроме того, желаемый формат вывода ужасен. Вместо этого использует стандартные форматы ISO 8601 для обмена данными. Для представления пользователю используйте DateTimeFormatter.ofLocalizedDateTime. Обе эти темы неоднократно затрагивались при переполнении стека, поэтому ищите, чтобы узнать больше.

1 голос
/ 23 января 2020

Первый - поздравляем с использованием Java 8 временных функций - мудрый выбор!

По вашему вопросу:

  1. Это способ конвертации "LocalDate" в "java .util.Date":

    Date myDate =  Date.from(localDate.atZone(ZoneId.systemDefault()).toInstant());
    
    ... or ...
    
    Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    

Согласно документации:

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

LocalDate - это неизменяемый объект даты-времени, который представляет дату, часто рассматриваемую как год-месяц-день. Другие поля даты, такие как день года, день недели и неделя года, также могут быть доступны. Например, значение «2nd October 2007» может быть сохранено в LocalDate.

Этот класс не хранит и не представляет время или часовой пояс. Вместо этого это описание даты, используемой для дней рождения. Он не может представлять момент на временной шкале без дополнительной информации, такой как смещение или часовой пояс.

Так что лучшим выбором может быть LocalDateTime

В любом случае «java .util.Date» автоматически имеет «все, что вам нужно» ». Это объект «дата / время». Хранит дату и время независимо от часового пояса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...