DateTime не может и не должен иметь формат
Вы не можете. Вы спрашиваете о невозможном. Вам также не следует этого хотеть.
A DateTime
представляет дату и время в часовом поясе. Он не имеет, как не может иметь формат. Вы можете иметь любой формат в String
. Только в String
, а не в DateTime
. Также как у вас не может быть int
с форматом. Вы можете отформатировать int
в различные строки, такие как 18
, 0018
, +18
и 0x0012
, но int
остается неизменным.
Это хорошо! Хорошая практика во всех программах, кроме простейших одноразовых, говорит о том, что мы должны держать модель и представление отдельно. Ваша дата и время принадлежат вашей модели, здесь нам нужен ваш DateTime
. Как это выглядит, его формат - вопрос презентации. не относится к вашей модели.
Поэтому, когда вы читаете дату и время из базы данных, удовлетворяйте себя объектом DateTime
, как вы уже делаете, и не делайте этого. беспокоиться о формате, потому что у него нет. Всякий раз, когда вам нужна строка в указанном вами компактном формате, отформатируйте DateTime
в такую строку, используя тот же форматер.
В вашем анализе есть ошибка
Вы не спрашивали об этом , но вы должны знать.
println("Neo4J: " + record.get("assetDateTime").asString) // Neo4J: 20200406T145511.067Z
println("Joda: " + assetDateTime) // Joda: 2020-04-06T14:55:11.067+01:00
Пожалуйста, обратите внимание на дату и время в комментариях. Они не одинаковы. Первый находится в UT C, обозначаемом конечным Z
. Да, Z
- это смещение нуля от UT C. Последняя дата-время имеет тот же час дня и другое смещение UT C, +01:00
. Таким образом, он обозначает другой момент времени, равный 2020-04-06T13: 55: 11.067 UT C.
Ваша проблема заключается в жестком кодировании Z
в строке шаблона формата, заключив его в одинарные кавычки , Никогда не делай этого. Смещение должно быть проанализировано как смещение. Для этого используйте ZZ
в строке шаблона формата. В Java (потому что это то, что я могу написать):
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZZ");
String assetDateTimeString = "20200406T145511.067Z";
DateTime itemDateTime = dateTimeFormat.parseDateTime(assetDateTimeString);
System.out.println(itemDateTime);
Вывод при запуске в часовом поясе Европы / Лондона:
2020-04-06T15: 55: 11.067 + 01: 00
Если вы хотите сохранить смещение от строки, сообщите вашему форматеру так:
DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd'T'HHmmss.SSSZZ")
.withOffsetParsed();
2020-04-06T14: 55: 11.067Z