Дата как длинное значение для LocalDateTime

Как преобразовать длинное значение, например 2018051822111234L, в yyyyMMdd HH:mm?

2018051822111234 -> 2018 05 18 22:11:12.

Пробовал с LocalDate.parse и DateFormatter(yyyy-MM-dd'T'HH:mm:ssZZZZZ). Это не работает для меня.


person DevJam    schedule 30.01.2018    source источник
comment
ваше длинное значение должно быть строкой   -  person XtremeBaumer    schedule 30.01.2018
comment
Преобразуйте в String, затем используйте LocalDate.parse   -  person Elliott Frisch    schedule 30.01.2018
comment
captial Z сигнализирует о смещении часового пояса, которого нет в вашем значении. также форматер должен соответствовать значению, а не желаемому результату   -  person XtremeBaumer    schedule 30.01.2018
comment
Возможный дубликат String to LocalDateTime вызывает исключение DateTimeParseException   -  person Ole V.V.    schedule 30.01.2018


Ответы (2)


Месье Низе уже дал отличный ответ. Это просто я: я хотел бы проанализировать полную точность ввода long. Легче выбросить информацию позже, чем добавить ее позже, если она не была проанализирована с самого начала.

Решение Java 9:

    DateTimeFormatter longFormatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmssSS");
    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern("uuuu MM dd HH:mm:ss");
    String asString = Long.toString(2018051822111234L);
    String result = LocalDateTime.parse(asString, longFormatter)
            .format(desiredFormatter);

Это печатает

2018 05 18 22:11:12

Как вы уже сами сказали, это не работает в Java 8 из-за этой ошибки в JRE: DateTimeFormatter не анализирует даты в пользовательском формате "ггггММддЧЧммссССС". В отчете об ошибке упоминается следующий обходной путь:

    DateTimeFormatter longFormatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuuMMddHHmmss")
            .appendValue(ChronoField.MILLI_OF_SECOND, 3)
            .toFormatter();
    asString += '0';

Форматировщик обходного пути имеет три десятичных знака в секундах, соответствующих миллисекундам, тогда как ваш long имеет только два. Итак, выше я добавляю к строке дополнительные 0 перед разбором. Это было то, что я мог заставить работать в Java 8 (также пробовал appendFraction(), тщетно). Теперь результат тот же, что и выше.

person Ole V.V.    schedule 30.01.2018

person    schedule
comment
Поэтому, если я попытаюсь добавить ms с шаблоном yyyyMMddHHmmssSSS и не изменю длину строки (строка имеет длину 17), она не сможет проанализировать индекс 0 - person DevJam; 30.01.2018
comment
Это ошибка, которая будет исправлена ​​в Java 9 –> bugs.openjdk.java.net/ просмотреть/JDK-8031085 - person DevJam; 30.01.2018
comment
В отчете об ошибке, на который вы ссылаетесь, @DevJam, упоминается следующий обходной путь: DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss").appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter(). Я бы предпочел попробовать что-то подобное, чтобы проанализировать полную точность вашего long. - person Ole V.V.; 30.01.2018