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