Как преобразовать длинное значение, например 2018051822111234L
, в yyyyMMdd HH:mm
?
2018051822111234 -> 2018 05 18 22:11:12.
Пробовал с LocalDate.parse
и DateFormatter(yyyy-MM-dd'T'HH:mm:ssZZZZZ)
. Это не работает для меня.
Как преобразовать длинное значение, например 2018051822111234L
, в yyyyMMdd HH:mm
?
2018051822111234 -> 2018 05 18 22:11:12.
Пробовал с LocalDate.parse
и DateFormatter(yyyy-MM-dd'T'HH:mm:ssZZZZZ)
. Это не работает для меня.
Месье Низе уже дал отличный ответ. Это просто я: я хотел бы проанализировать полную точность ввода 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()
, тщетно). Теперь результат тот же, что и выше.
DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss").appendValue(ChronoField.MILLI_OF_SECOND, 3).toFormatter()
. Я бы предпочел попробовать что-то подобное, чтобы проанализировать полную точность вашего long
.
- person Ole V.V.; 30.01.2018
String
, затем используйтеLocalDate.parse
- person Elliott Frisch   schedule 30.01.2018Z
сигнализирует о смещении часового пояса, которого нет в вашем значении. также форматер должен соответствовать значению, а не желаемому результату - person XtremeBaumer   schedule 30.01.2018