格式化即时到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());
如果您不想要,则不需要将其转换为LocalDateTime
, Instant
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。