UTC给定时区的日期和时间

时间:2019-12-06 08:59:15

标签: java date time

i具有以下字符串:2019120610000100,它对应于10:00 +1的2019/12/06。 我如何将其转换为世界标准时间,在这种情况下为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
}

3 个答案:

答案 0 :(得分:2)

您可以通过以下代码直接将时间转换为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")); 

答案 1 :(得分:2)

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

在您的情况下,您想使用OffsetDateTime,因为您的字符串精确地表示了:具有偏移量的日期时间。请注意,ZonedDateTime在这里并不是真正合适的,因为偏移量信息(例如“ +01:00”)不足以代表整个时区。 Look at this SO question for more information.

要从字符串中获取import * as mapboxgl from 'mapbox-gl'; ,您只需对其进行解析。

开始吧。

第1步:调整字符串以包含偏移符号(正负)。

npm install mapbox-gl --save

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

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

第3步:将OffsetDateTime转换为UTC。

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

打印出这些变量

OffsetDateTime

将为您提供以下输出:

  

201912061000 + 0100

     

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

     

2019-12-06T09:00Z

答案 2 :(得分:0)

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));

由于您是从外部处理时区偏移的正负,因此您可以将其插入上面的示例中,而不是如果需要的话,可以将其插入正负。