ТЛ; др
format.parse( Info.get("TIME") ) // Get a legacy `java.util.Date` object.
.toInstant() // Convert from legacy class to modern class.
.atOffset( // Convert from the basic `Instant` class to the more flexible `OffsetDateTime` class.
ZoneOffset.UTC // Specify the offset-from-UTC in which you want to view the date and time-of-day.
)
.format( // Generate text representing the value of our `OffsetDateTime` object.
DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" ) // Specify your custom formatting pattern. Better to cache this object, in real work.
) // Returns a `String
Date
был заменен несколько лет назад на Instant
. В методе Instant::toString
используется гораздо лучший формат, современный стандартный формат.
Instant.now().toString()
2019-06-04T20: 11: 18.607231Z
Конвертируйте ваши Date
объекты, myDate.toInstant()
.
Подробнее
Метод Object::toString
не должен быть гибким. Его целью является предоставление упрощенного представления объекта при отладке или ведении журнала.
Однако, как вы видели, реализация java.util.Date::toString
ужасна.
Сначала ложь, применяя текущий часовой пояс JVM по умолчанию к моменту, сохраненному в объекте Date
. Этот момент на самом деле в UTC . Это искажение создает иллюзию часового пояса, которого на самом деле нет в объекте.
Во-вторых, метод Date::toString
использует ужасный формат, только английский, трудный для чтения людьми и трудно разбираемый машиной.
Класс Date
имеет много других проблем. Вы больше не должны использовать этот класс вообще. С принятием JSR 310 его вытеснил класс java.time.Instant
.
Вам следует заменить Date
на Instant
, где вы можете. Где вы не можете конвертировать. Вызовите новые методы, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
К счастью, метод toString
на Instant
разработан намного лучше. Это говорит вам правду, момент в UTC . И он использует стандартные форматы ISO 8601 . Этот стандарт был придуман специально для передачи значений даты и времени в виде текста таким образом, чтобы их было легко проанализировать на машине и легко прочитать людям в разных культурах.
String output = instant.toString() ;
2019-06-04T20: 11: 18.607231Z
Таким образом, список Instant
объектов будет выглядеть следующим образом.
Instant now = Instant.now();
List < Instant > instants = List.of( now.minus( 1L , ChronoUnit.HOURS ) , now , now.plus( 20L , ChronoUnit.MINUTES ) );
String output = instants.toString();
[2019-06-04T19: 41: 51.210465Z, 2019-06-04T20: 41: 51.210465Z, 2019-06-04T21: 01: 51.210465Z]
Ваш кодовый фрагмент
Что касается вашего фрагмента кода, преобразуйте его в объект java.time.OffsetDateTime
и сгенерируйте текст с использованием пользовательского шаблона форматирования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" ) ;
…
if(Info.get("TIME")!=null)
{
try {
Date date = format.parse( Info.get("TIME") ) ;
Instant instant = date.toInstant() ;
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
String output = odt.format( f ) ;
message.TimeHistory.add(date);
}
catch (Exception e){
}
}