ThreeTen и парсинг Instant

Я использую ThreeTen и пытаюсь отформатировать Instant. Было бы проще просто разделить его, но мне любопытно, должно ли это работать? Из всего, что я прочитал, Instant должен быть доступен для анализа и со всеми компонентами шаблона:

@Test
public void testInstants()  {
    Instant instant = Instant.now();
    String dbDatePattern = "YYYY-MM-dd HH:mm:ss.SSS";
    try {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dbDatePattern);
        String dbDate = formatter.format(instant);
    } catch (Exception ex) {
        int dosomething = 1;
    }
}

Ошибка: org.threeten.bp.temporal.UnsupportedTemporalTypeException: неподдерживаемое поле: DayOfWeek

dd - это день месяца, а не DayofWeek. Вероятно, меня подбросили отвлекающим маневром, но это кажется странным.


person user1351848    schedule 12.09.2014    source источник


Ответы (2)


Буква шаблона «Y» означает год на основе недели в ThreeTen-Backport и JSR-310 (это означало год эры в Joda-Time). Чтобы рассчитать год на основе недели, необходим день недели, отсюда и ошибка.

Обратите внимание, что Instant не может предоставлять поля для средства форматирования, которое вы пытаетесь создать. Только ZonedDateTime, LocalDateTime или OffsetDateTime могут. Instant — это особый случай, который должен быть отформатирован с использованием DateTimeFormatter.ISO_INSTANT или аналогичного.

person JodaStephen    schedule 13.09.2014

Чтобы сделать явный ответ JodaStephen:

String dbDatePattern = "YYYY-MM-dd HH:mm:ss.SSS"; (ГГГГ в верхнем регистре)

должно быть

String dbDatePattern = "yyyy-MM-dd HH:mm:ss.SSS"; (строчные гггг)

вместо.

Также, вместо

Instant instant = Instant.now();

do

LocalDateTime localDateTime = LocalDateTime.now();

...и затем передайте это format() вместо этого.

Поскольку и Instant, и LocalDateTime реализуют TemporalAccessor, а это то, что принимает DateTimeFormatter.format(), остальная часть вашего кода должна работать как есть.

person László van den Hoek    schedule 28.10.2014