繁体   English   中英

给定时区的 UTC 日期和时间

[英]Date and time to UTC given timezone

我有以下字符串:2019120610000100 对应于 2019/12/06 10:00 +1。 如何将其转换为 UTC 时间,在这种情况下为 2019/12/06 09:00?

这个字符串也可以有 +2, +3 ... -1, -2 ... 时区,所以我也必须能够转换其他字符串。

+ 或 - 符号在另一个实例中给出,但是,如果它有用,可以将其添加到时间和日期字符串中。 (字符串可以变成 201912061000 +0100)

现在我正在转换它手动拆分字符串,但我正在尝试找到一种方法来使其安全,因为它会变得棘手,例如 00 的小时和分钟必须更改日期,可能是月份和年份。 这是我到目前为止所做的:

hour -= hourOffset;
if(hour<0){
    hour += 24
}
minutes -= minutesOffset;
if(minutes<0){
    minutes += 60
}

您可以通过以下代码将时间直接转换为UTC

 String dateStr = "201912061000+0100";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
    final LocalDateTime parse = LocalDateTime.parse(dateStr.substring(0, dateStr.length()-5), formatter);
    final ZoneId zone = ZoneId.of("GMT"+dateStr.substring(12,15)+":"+dateStr.substring(15));
    final ZonedDateTime given = ZonedDateTime.of(parse, zone);
    final String toUTC = given.withZoneSameInstant(ZoneId.of("UTC"))
        .format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")); 

在处理日期和时间时,通常最好不要进行字符串操作,而是使用从java.time包中扩展java.time.temporal.Temporal的众多类之一 - 随 Java 8 引入。

在您的情况下,您想使用OffsetDateTime ,因为您的字符串正好表示:带有偏移量的日期时间。 请注意, ZonedDateTime在这里并不合适,因为偏移信息(例如“+01:00”)不足以表示整个时区。 查看此 SO 问题以获取更多信息。

要从字符串中获取OffsetDateTime ,您必须简单地解析它。

我们开始做吧。

步骤 1:调整您的字符串以包含偏移符号(加号或减号)。

String offsetSign = "+";
String datetimeString = "2019120610000100";
datetimeString = new StringBuilder(datetimeString).insert(datetimeString.length() - 4, offsetSign).toString();

第 2 步:将该字符串解析为OffsetDateTime对象。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmZ");
OffsetDateTime odt = OffsetDateTime.parse(datetimeString, dtf);

第 3 步:将该OffsetDateTime转换为 UTC。

OffsetDateTime odtUTC = odt.withOffsetSameInstant(ZoneOffset.UTC);

打印出这些变量

System.out.println(datetimeString);
System.out.println(odt);
System.out.println(odtUTC);

将为您提供以下输出:

201912061000+0100

2019-12-06T10:00+01:00

2019-12-06T09:00Z

String dateStr = "2019120610000100";
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("yyyyMMddHHmm Z");
DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm");

String adjustedDateStr = new StringBuilder(dateStr).insert(dateStr.length() - 4, " +").toString();
ZonedDateTime givenDate = ZonedDateTime.parse(adjustedDateStr, dtfInput);

ZonedDateTime timezoneAdjustedDate = ZonedDateTime.ofInstant(givenDate.toInstant(), ZoneId.of("UTC"));

System.out.println(dtfOutput.format(timezoneAdjustedDate));

由于您在外部处理时区偏移的加号或减号,因此如果需要,您可以将其插入上面的 exsample 而不是加号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM