How to convert ISO 8601 formatted DateTime to another time zone in Java?
我目前的日期:
日期:2018-06-06T16:30:00Z(UTC中的ISO 8601)
要么
日期iso:2018-06-06T11:30:00-05:00(ISO 8601)
要么
日期时间:1528302600000(Epoch / Unix时间戳)
我希望将上述DateTime转换为其他时区(如GMT + 5:30)。 而且我不确定从三个以上我会收到哪种时间格式。 那么我可以使用一个泛型方法,它可以将上面的代码转换为另一个在Java 8中返回java.util.Date的时区吗?
我做了这样的事,但它没有成功
1 2 3 4 5 6 7 8 9 10 | public Date convertDateToLocalTZ(Date iso8601, ZoneId toZoneId) { Date dateTime = null; if (iso8601 != null && toZoneId != null) { Instant instant = iso8601.toInstant(); LocalDateTime localDateTime = instant.atZone(toZoneId).toLocalDateTime(); dateTime = Date.from(localDateTime.atZone(toZoneId).toInstant()); return dateTime; } return dateTime; } |
由于问题被标记为
更新:对于问题的第4版,其中添加了
要解析
要解析
要将时区专门更改为特定的偏移量,如
注1:
注意2:要更改区域的时区,遵守夏令时,请使用例如
要解析所有3种输入格式,甚至支持
1 2 3 4 5 |
然后,调用者可以通过使用
测试
1 2 3 4 5 6 7 | ZoneId india = ZoneId.of("Asia/Kolkata"); System.out.println(parseToZone("2018-06-06T16:30:00Z", india)); System.out.println(parseToZone("2018-06-06T11:30:00-05:00", india)); System.out.println(parseToZone("1528302600000", india)); System.out.println(parseToZone("1528302600000", india).toOffsetDateTime()); |
产量
1 2 3 4 | 2018-06-06T22:00+05:30[Asia/Kolkata] 2018-06-06T22:00+05:30[Asia/Kolkata] 2018-06-06T22:00+05:30[Asia/Kolkata] 2018-06-06T22:00+05:30 |
原始答案
将
将
然后使用
演示
1 2 3 4 5 6 7 8 9 10 11 | Instant instant1 = Instant.parse("2018-06-06T16:30:00Z"); Instant instant2 = Instant.ofEpochMilli(1528302600000L); ZoneId india = ZoneId.of("Asia/Kolkata"); ZonedDateTime date1 = instant1.atZone(india); ZonedDateTime date2 = instant2.atZone(india); System.out.println(instant1); System.out.println(instant2); System.out.println(date1); System.out.println(date2); |
产量
1 2 3 4 | 2018-06-06T16:30:00Z 2018-06-06T16:30:00Z 2018-06-06T22:00+05:30[Asia/Kolkata] 2018-06-06T22:00+05:30[Asia/Kolkata] |
要以人格式打印结果,请使用
1 2 3 4 5 6 | DateTimeFormatter indiaFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) .withLocale(Locale.forLanguageTag("en-IN")); DateTimeFormatter hindiFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) .withLocale(Locale.forLanguageTag("hi-IN")); System.out.println(date1.format(indiaFormatter)); System.out.println(date1.format(hindiFormatter)); |
产量
1 2 | 6 June 2018 at 10:00:00 PM IST 6 ??? 2018 ?? 10:00:00 ??????? IST |
在Java 8+中,您应该使用新的java.time API。
您的初始UTC时间必须模型化为Instant。如果需要,使用DateTimeFormatter从
然后,您可以使用Instant.atZone或Instant.withOffset转换为ZonedDateTime resp。具有所需时移的OffsetDateTime。 ZonedDateTime可帮助您获取给定地区/国家/地区的日期/时间,而OffsetDateTime可实现与位置和夏令时无关的纯数值时移。