【问题标题】:How to transfer date and time from one time zone to another when changing the date?更改日期时如何将日期和时间从一个时区转移到另一个时区?
【发布时间】:2021-10-04 05:11:09
【问题描述】:

我不熟悉在 java 中处理日期、时间和时区,所以不要严格判断)。我正在开发一个在当前日期将消息写入数据库的应用程序。但是有一种情况,一条消息可能来自不同的时区,因此,这是一个不同的时间,它与我发送到数据库的时间不一致。

我收到值“2021-07-28 15:30:00 Europe / Minsk” - 带时区的日期时间(也可以采用 UTC),“Asia / Kamchatka” - 日期和时间所在的时区应该转换。我想知道“欧洲/明斯克”时区的日期“2021-07-28 15:30:00 Asia / Kamchatka”。

问题是,在时区(亚洲/堪察加)2021-07-28 15:30:00 + 9 = 2021-07-29 00:30 添加时间时,存在一种情况。在没有时间的情况下,我需要在所有计算之后得到一个 DATE。

【问题讨论】:

  • 时区拼写错误。 Time zone names 没有任何空格字符。教育您的数据发布者发送Asia/Kamchatka 而不是Asia / Kamchatka。我修正了您在示例字符串之外的区域名称拼写。如果空格字符是您自己的错字,请编辑您的问题以更正。否则,空格会为您的问题增加额外的皱纹,以便在任何解决方案中解决。

标签: java date calendar timezone localdate


【解决方案1】:

我想知道日期“2021-07-28 15:30:00 Asia / Kamchatka”在 时区“欧洲/明斯克”。

您可以使用ZonedDateTime#withZoneSameInstant 来满足此要求。

问题是有一种情况,当在 时区(亚洲/堪察加)2021-07-28 15:30:00 + 9 = 2021-07-29 00:30。我需要在没有时间的情况下进行所有计算后获取 DATE。

您可以使用ZonedDateTime#toLocalDate 来满足此要求。

演示:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s z", Locale.ENGLISH);
        String strDateTime = "2021-07-28 15:30:00 Asia/Kamchatka";
        ZonedDateTime zdtInput = ZonedDateTime.parse(strDateTime, dtf);
        ZonedDateTime zdtOuput = zdtInput.withZoneSameInstant(ZoneId.of("Europe/Minsk"));
        System.out.println(zdtInput);
        System.out.println(zdtOuput);
        System.out.println(zdtOuput.toLocalDate());
    }
}

输出:

2021-07-28T15:30+12:00[Asia/Kamchatka]
2021-07-28T06:30+03:00[Europe/Minsk]
2021-07-28

ONLINE DEMO

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

注意:下面引用的是 Basil Bourque 的宝贵评论:

问题中的示例数据显示时区名称拼写错误 在斜线的每一侧都有一个空格字符。我建议你添加一个 使用 String#replace 替换单个字符的代码位 “/”表示三重字符“/”解析前。

如果是这种情况,在解析日期时间字符串之前,需要去掉/分隔符前后的空白字符。你可以这样做:

String strDateTime = "2021-07-28 15:30:00 Asia / Kamchatka";
strDateTime = strDateTime.replaceAll("\\s+/\\s+", "/");

其余代码将按原样运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2015-11-05
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2010-11-26
    相关资源
    最近更新 更多