Format Instant to String
我正在尝试使用新的java 8 time-api和模式将Instant格式化为String:
1 2 | Instant instant = ...; String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant); |
使用上面的代码我得到一个异常,它抱怨一个不受支持的字段:
1 2 3 4 | java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra at java.time.Instant.getLong(Instant.java:608) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) ... |
时区
要格式化
可以使用
1 2 3 4 | DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT ) .withLocale( Locale.UK ) .withZone( ZoneId.systemDefault() ); |
生成字符串
现在使用该格式化程序生成Instant的String表示形式。
1 2 |
转储到控制台。
1 2 3 |
跑步时
1 2 3 | formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB instant: 2015-06-02T21:34:33.616Z output: 02/06/15 14:34 |
1 2 3 4 5 6 7 8 |
因此,格式化程序无法打印日期,因为日期始终打印为具体时区。
您应该将时区设置为格式化程序,一切都会好的,如下所示:
1 2 3 4 | Instant instant = Instant.ofEpochMilli(92554380000L); DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC); assert formatter.format(instant).equals("07/12/72 05:33"); assert instant.toString().equals("1972-12-07T05:33:00Z"); |
1 | DateTimeFormatter.ISO_INSTANT.format(Instant.now()) |
这样您就不必转换为UTC。但是,其他一些语言的时间框架可能不支持毫秒,所以你应该这样做
1 | DateTimeFormatter.ISO_INSTANT.format(Instant.now().truncatedTo(ChronoUnit.SECONDS)) |
或者,如果您仍想使用从模式创建的格式化程序
你可以使用LocalDateTime而不是Instant:
1 2 | LocalDateTime datetime = LocalDateTime.now(); DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(datetime) |
1 2 3 | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd"); String text = date.toString(formatter); LocalDate date = LocalDate.parse(text, formatter); |
我相信这可能会有所帮助,您可能需要使用某种localdate变体而不是即时变体