Странная ошибка при разборе даты ISO 8601 в java

У меня есть этот фрагмент кода на Scala, использующий java.util .Дата из Java:

val ISO8601Format = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss")
ISO8601Format.setLenient(false)

val currentDate = new Date()
val str = ISO8601Format.format(currentDate)
val dateParsed = ISO8601Format.parse(str)
val dateParsed2 = ISO8601Format.parse(str)
val dateParsed3 = ISO8601Format.parse(str)

println(currentDate.getTime)             // 1429124862000
println(dateParsed.getTime)              // 1429124862157
println(dateParsed2.getTime)      // 1429124862000
println(dateParsed3.getTime)     // 1429124862000

ISO 8601 отличается от стандарта, поскольку я реализую модифицированную версию без смещения от UTC. потому что XML-RPC (протокол, который я реализую) использует этот формат.

Проблема в том, что первая проанализированная дата всегда возвращает другое значение (последние три цифры отличаются), чем начальная дата (currentDate). Однако, если вы анализируете одну и ту же отформатированную строку несколько раз, они всегда возвращают исходную дату, которую она должна возвращать.

Почему? Жук? Любая идея исправить это?

(Я делаю библиотеку для Scala, и мне нужно поддерживать Java Dates, пожалуйста, не рекомендуйте Joda-Time .)


person Jorge Vicente Cantero    schedule 15.04.2015    source источник
comment
Это выглядит очень странно — можете ли вы воспроизвести это с помощью короткой, но полной программы на Java? Вы используете формат в нескольких потоках?   -  person Jon Skeet    schedule 15.04.2015
comment
Может быть, это потому, что вы анализируете строку с секундами, но выводите в миллисекундах. Значение в миллисекундах (последние 3 цифры) соответствует моменту создания экземпляра currentDate. Однако это не объясняет вывод для dateParsed2 и dateParsed3.   -  person Sanj    schedule 15.04.2015
comment
Да, @Sanj, я так и думал, но когда я проверял dateParsed2 и dateParsed3, это не имело смысла.   -  person Jorge Vicente Cantero    schedule 15.04.2015
comment
@JonSkeet Как вы хотите, чтобы я воспроизвел это? Если хотите, я могу сделать суть с правильным импортом.   -  person Jorge Vicente Cantero    schedule 15.04.2015
comment
Я не использую его в нескольких потоках @JonSkeet, суть уже в пути.   -  person Jorge Vicente Cantero    schedule 15.04.2015
comment
Строка даты и времени без смещения от UTC соответствует стандарту ISO 8601, в отличие от 2-го абзаца Вопроса. Такая строка интерпретируется как локальная дата-время, означающая дату-время, которая относится к любой конкретной местности, а не к точке на временной шкале истории. Пример: Рождество начинается ровно в полночь 25 декабря 2015 года, 2015-12-25T00:00:00.000, в разные моменты времени в каждой местности в конкретную полночь.   -  person Basil Bourque    schedule 16.04.2015
comment
Кроме того, не путайте часовой пояс с смещение-от-UTC. Часовой пояс — это смещение плюс такая информация, как переход на летнее время и другие аномалии (прошлое, настоящее и будущее).   -  person Basil Bourque    schedule 16.04.2015


Ответы (1)


Я должен поддерживать Java Dates, пожалуйста, не рекомендуйте Joda-Time.

На самом деле вы можете использовать Joda-Time или java.time, сохраняя при этом совместимость с java.time. Свидание.

Делайте тяжелую работу с помощью Joda-Time или java.time. Затем, в конце, преобразуйте в java.util.Date.

Пример в Joda-Time 2.7.

String input = "20150123T12:34:56";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyyMMdd'T'HH:mm:ss" ).withZoneUTC();
DateTime dateTime = formatter.parseDateTime( input );

Теперь конвертируйте из Joda-Time в java.util.Date.

java.util.Date date = dateTime.toDate();  // Easily convert to a java.util.Date instance.

Дамп на консоль.

System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "date: " + date );

Когда бег.

input: 20150123T12:34:56
dateTime: 2015-01-23T12:34:56.000Z
date: Fri Jan 23 04:34:56 PST 2015
person Basil Bourque    schedule 15.04.2015
comment
Да, я знаю это и использую его, потому что мне нужно поддерживать как даты Java, так и даты времени Joda. - person Jorge Vicente Cantero; 16.04.2015