Как преобразовать DateTimeFormat.forStyle() Joda-Time в JSR 310 JavaTime?

Я работаю над преобразованием плагина Grails Joda-Time в JavaTime.

И у меня есть старый временной код Joda:

    def style
    switch (type) {
        case LocalTime:
            style = '-S'
            break
        case LocalDate:
            style = 'S-'
            break
        default:
            style = 'SS'
    }
    Locale locale = LocaleContextHolder.locale
    return DateTimeFormatter.ofPattern(style, locale).withResolverStyle(ResolverStyle.LENIENT)

Как я могу преобразовать его в JSR 310? Я не могу найти ничего похожего на метод forStyle(стиль строки), который принимает стиль.

UPD Я нашел обходной путь:

        Locale locale = LocaleContextHolder.locale
        DateTimeFormatter formatter
        switch (type) {
            case LocalTime:
                formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(locale)
                break
            case LocalDate:
                formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale)
                break
            default:
                formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(locale)
        }
        return formatter

Но это не Instant типа. Спок Спок для воспроизведения:

def 'Instant locale formatting'() {
    given:
    Instant inst = Instant.ofEpochMilli(92554380000L)
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(UK)
    expect:
    formatter.format(inst) == "07/12/72 05:33"
}

Этот тест завершается с ошибкой:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth
    at java.time.Instant.getLong(Instant.java:603)
    at java.time.format.DateTimePrintContext$1.getLong(DateTimePrintContext.java:205)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4350)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1744)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1718)

Итак, почему форматер не может отформатировать Instant?


person Sergey Ponomarev    schedule 12.12.2014    source источник


Ответы (2)


Методы ofLocalizedDate(), ofLocalizedTime() и ofLocalizedDateTime() предоставляют локализованные форматы.

Для форматирования Instant требуется часовой пояс. Это можно добавить в средство форматирования с помощью withZone():

DateTimeFormatter formatter =
    DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                     .withLocale(UK)
                     .withZone(ZoneId.systemDefault());

Без зоны средство форматирования JSR-310 не знает, как преобразовать мгновенное значение в поля даты и времени человека.

person JodaStephen    schedule 15.12.2014
comment
Я обнаружил странную проблему, возможно, ошибку stackoverflow.com/questions/27488494/ - person Sergey Ponomarev; 16.12.2014

В JSR 310 есть другие способы замены стиля: DateTimeFormatter.ofLocalizedTime(), DateTimeFormatter.ofLocalizedDate() и DateTimeFormatter.ofLocalizedDateTime()

Другая проблема заключается в том, что тип Instant не может быть отформатирован Format Instant to String

person Sergey Ponomarev    schedule 12.12.2014