簡體   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