当时区从程序设置为 UTC 时的时间(以毫秒为单位)
Time in milliseconds when Timezone set as UTC from program
我的计算机时区是 IST,我正在执行以下代码
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SimpleDateFormat format1 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
long millisFromDate = format1.parse("Tue, 22 Jun 2021 15:40:52 IST").getTime();
System.out.println(millisFromDate);
上面的代码片段打印出 1624369252000。
现在当我转换 1624369252000
UTC 时间和日期:2021 年 6 月 22 日星期二 13:40:52 https://currentmillis.com/
我觉得我做错了什么。有人可以帮忙吗?
在 UTC 中应该是 10:10:52?
使用 java.time 指定 IST[=42=] 的含义
我总是建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。
像 IST 这样的三字母时区缩写非常常见,可能最常见的是模棱两可的,因此也经常会给您带来与预期不同的结果。我怀疑这也是你的情况。
java.time 让我们有机会在缩写不明确的情况下指定一个或多个首选时区。例如:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Atlantic/Reykjavik"));
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("EEE, dd MMM yyyy HH:mm:ss ")
.appendZoneText(TextStyle.SHORT, PREFERRED_ZONE)
.toFormatter(Locale.ROOT);
使用:
String dateTimeString = "Tue, 22 Jun 2021 15:40:52 IST";
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString, FORMATTER);
System.out.println(zdt);
long millisFromDate = zdt.toInstant().toEpochMilli();
System.out.println(millisFromDate);
这种情况下的输出:
2021-06-22T15:40:52Z[Atlantic/Reykjavik]
1624376452000
所以只需在第一行填写您想要的时区 ID。其他示例:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Europe/Dublin"));
2021-06-22T15:40:52+01:00[Europe/Dublin]
1624372852000
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Asia/Tel_Aviv"));
2021-06-22T15:40:52+03:00[Asia/Tel_Aviv]
1624365652000
您预期的结果相当于 10:10:52 UTC。你从以下获得:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Asia/Kolkata"));
2021-06-22T15:40:52+05:30[Asia/Kolkata]
1624356652000
Asia/Colombo
的首选区域给出相同的结果。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Time Zone Abbreviations – Worldwide List
我的计算机时区是 IST,我正在执行以下代码
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
SimpleDateFormat format1 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
long millisFromDate = format1.parse("Tue, 22 Jun 2021 15:40:52 IST").getTime();
System.out.println(millisFromDate);
上面的代码片段打印出 1624369252000。
现在当我转换 1624369252000 UTC 时间和日期:2021 年 6 月 22 日星期二 13:40:52 https://currentmillis.com/
我觉得我做错了什么。有人可以帮忙吗?
在 UTC 中应该是 10:10:52?
使用 java.time 指定 IST[=42=] 的含义
我总是建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。
像 IST 这样的三字母时区缩写非常常见,可能最常见的是模棱两可的,因此也经常会给您带来与预期不同的结果。我怀疑这也是你的情况。
java.time 让我们有机会在缩写不明确的情况下指定一个或多个首选时区。例如:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Atlantic/Reykjavik"));
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("EEE, dd MMM yyyy HH:mm:ss ")
.appendZoneText(TextStyle.SHORT, PREFERRED_ZONE)
.toFormatter(Locale.ROOT);
使用:
String dateTimeString = "Tue, 22 Jun 2021 15:40:52 IST";
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString, FORMATTER);
System.out.println(zdt);
long millisFromDate = zdt.toInstant().toEpochMilli();
System.out.println(millisFromDate);
这种情况下的输出:
2021-06-22T15:40:52Z[Atlantic/Reykjavik] 1624376452000
所以只需在第一行填写您想要的时区 ID。其他示例:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Europe/Dublin"));
2021-06-22T15:40:52+01:00[Europe/Dublin] 1624372852000
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Asia/Tel_Aviv"));
2021-06-22T15:40:52+03:00[Asia/Tel_Aviv] 1624365652000
您预期的结果相当于 10:10:52 UTC。你从以下获得:
private static final Set<ZoneId> PREFERRED_ZONE = Set.of(ZoneId.of("Asia/Kolkata"));
2021-06-22T15:40:52+05:30[Asia/Kolkata] 1624356652000
Asia/Colombo
的首选区域给出相同的结果。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time.
- Time Zone Abbreviations – Worldwide List