[英]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.