由于问题被标记为java-8,请使用java.time API。
更新:对于问题的版本 4,其中添加了 2018-06-06T11:30:00-05:00。
要解析1528302600000,请将其解析为long,然后使用Instant.ofEpochMilli()。
要解析2018-06-06T11:30:00-05:00 之类的格式,您可以使用OffsetDateTime 或ZonedDateTime。两者都可以解析2018-06-06T16:30:00Z。
要将时区专门更改为特定的偏移量,例如 GMT+5:30,请使用 ZoneOffset,例如ZoneOffset.of("+05:30"),或ZoneId,例如ZoneId.of("GMT+05:30")。
注 1:GMT+5:30 无效。
注 2: 更改为地区的时区,遵守夏令时时间,使用例如ZoneId.of("Asia/Kolkata").
要解析所有 3 种输入格式,甚至支持 2018-06-06T11:30-05:00[America/Chicago] 之类的扩展格式,请使用 ZonedDateTime,并对 epoch 编号进行特殊处理。
public static ZonedDateTime parseToZone(String text, ZoneId zone) {
if (text.indexOf('-') == -1)
return Instant.ofEpochMilli(Long.parseLong(text)).atZone(zone);
return ZonedDateTime.parse(text).withZoneSameInstant(zone);
}
然后,调用者可以通过使用toOffsetDateTime() 将其转换为OffsetDateTime 来决定是否应该只使用偏移量而不是完整时区。
测试
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());
输出
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
原答案
将parse() 方法与2018-06-06T16:30:00Z 结合使用。
将ofEpochMilli() 方法与1528302600000 一起使用。
然后使用atZone() 转换为您想要的时区。
演示
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);
输出
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]
要以人类格式打印结果,请使用DateTimeFormatter。
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));
输出
6 June 2018 at 10:00:00 PM IST
6 जून 2018 को 10:00:00 अपराह्न IST