当时区从程序设置为 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 的首选区域给出相同的结果。

链接