已经有很多的答案,但只是想更新与java 8。
一般来说,我们面临着两个问题,日期
- 解析字符串到日期
- 显示日期在所需的字符串格式
DateTimeFormatter
在Java中8类可用于这两个目的。 下面的方法试图为这些问题提供解决方案。
方法1: 将您UTC字符串即时。使用即时您可以通过提供时区字符串为任何时区创建日期,并根据需要使用DateTimeFormatter
来格式化显示日期。
String dateString = "2016-07-13T18:08:50.118Z";
String tz = "America/Mexico_City";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a");
ZoneId zoneId = ZoneId.of(tz);
Instant instant = Instant.parse(dateString);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(dtf));
方法2:
使用DateTimeFormatter
内置常量e.g ISO_INSTANT
解析字符串LocalDate
。 ISO_INSTANT
可以解析图案的日期
YYYY-MM-dd'T'HH:MM:SSX例如'2011-12-03T10:15:30Z'
LocalDate parsedDate
= LocalDate.parse(dateString, DateTimeFormatter.ISO_INSTANT);
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("yyyy MM dd");
System.out.println(parsedDate.format(displayFormatter));
方法3 :
如果你的日期字符串有时间精度差不多例如,它捕获的秒部分,以及在这种情况下2016-07-13T18:08:50.118Z则方法1将工作但方法2不起作用。如果你尝试解析它将会抛出DateTimeException
由于ISO_INSTANT
格式化程序将无法解析秒数的小数部分,正如你可以从它的模式中看到的那样。 在这种情况下,您将不得不通过提供如下日期模式来创建定制DateTimeFormatter
。
LocalDate localDate
= LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));
你的格式有误。 – SLaks
你期望/希望代码实际执行什么? – Affe
返回一个有效的Date对象。 –