格式化即时到string

我正在尝试使用新的java 8 time-api和模式将即时格式化为string:

Instant instant = ...; String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant); 

使用上面的代码,我得到一个exception,抱怨不支持的字段:

 java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra at java.time.Instant.getLong(Instant.java:608) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) ... 

时区

要格式化Instant一个时区 。 如果没有时区,格式化程序不知道如何将即时转换为人类date时间字段,因此会引发exception。

可以使用withZone()将时区直接添加到格式化程序中。

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

生成string

现在使用该格式化程序来生成Instant的string表示。

 Instant instant = Instant.now(); String output = formatter.format( instant ); 

转储到控制台。

 System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() ); System.out.println("instant: " + instant ); System.out.println("output: " + output ); 

运行时。

 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 

您不能使用DateTimeFormatter格式化一个瞬间。 相反,你必须手工格式化。 一种方法是将Instant转换为LocalDateTime并使用String.printf()

这是一个从即时教程页面的例子

 Instant timestamp; ... LocalDateTime ldt = LocalDateTime.ofInstant(timestamp, ZoneId.systemDefault()); System.out.printf("%s %d %d at %d:%d%n", ldt.getMonth(), ldt.getDayOfMonth(), ldt.getYear(), ldt.getHour(), ldt.getMinute()); 

如果您不想要,则不需要将其转换为LocalDateTimeInstant get(TemporalField field)可用于获取date部分(月,日,年,小时,秒等)。 参见ChronoField获取常量列表。

如果你想要ISO-8601格式 ,只需使用Instant.toString()

编辑:如果你需要格式化的东西在一个string,并希望手工做到这一点,使用String.format()方法。 它与上面显示的System.out.printf方法相同,但返回一个String

Instant类不包含区域信息,它只存储UNIX纪元时间戳,即1070年1月1日UTC的时间戳。 所以,格式化程序不能打印date,因为date总是打印具体的时区。 你应该设置格式化时区,一切都会好起来,像这样:

 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"); 
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd"); String text = date.toString(formatter); LocalDate date = LocalDate.parse(text, formatter); 

我相信这可能有帮助,您可能需要使用某种本地化date变化,而不是瞬间

 Instant from=java.time.Clock.systemUTC().instant(); String output = from.toString(); 

您可以使用上述代码将实例转换为string。

Interesting Posts