簡體   English   中英

將輸入字符串日期時間從不同時區轉換為UTC

[英]Convert input String date time from different timezone to UTC

我的系統位於新加坡(時區 - “亞洲/新加坡”)從印度尼西亞的外部系統(時區 - “Asia / Jarkata”)獲得字符串日期時間(yyyy-MM-dd HH:mm:ss)。

如何在java 1.7中將收到的String datetime轉換為UTC?

這是我的代碼:

public void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jarkarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat(DateTimeUtils.DATE_TIME_FORMAT);
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat(DateTimeUtils.ISO_DATE_TIME_FORMAT);
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
        fromDate = inputSdf.parse(inputTime);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // UTC: 2018-02-02T10:09:00.000Z. Expected 2018-02-02T03:09:00.000Z
}

janith1024的回答是正確的。 但是,我認為真正的問題是舊的(和過時的) TimeZone類行為很糟糕,並沒有告訴你拼寫錯誤。 畢竟,我們都可以做到這一點。 所以真正的解決方案是使用java.time,即現代Java日期和時間API。 在Java 7(和6)上將ThreeTen Backport添加到您的項目中,導入:

import org.threeten.bp.ZoneId;

接着:

        ZoneId inputTz = ZoneId.of("Asia/Jarkarta");

這會給你一個org.threeten.bp.zone.ZoneRulesException: Unknown time-zone ID: Asia/Jarkarta 我應該說這大大增加了你發現拼寫錯誤的機會(正確的拼寫是亞洲/雅加達)。

TimeZone.getTimeZone()的文檔說它返回

指定的TimeZone,如果無法理解給定的ID,則為GMT區域。

但是我發布這個答案是因為你的問題不僅僅是一個例子。 我們一遍又一遍地看到來自舊日期和時間類的Stack Overflow問題顯示出令人驚訝的行為,特別是沒有檢測到我們傳遞給他們的數據的問題,這些問題很容易被發現。 我非常熱烈地建議使用現代API。

在Java 8及更高版本中,java.time是內置的,您應該使用子包而不是org.threeten.bpjava.time導入日期和時間類。

鏈接

我檢查你的代碼在時區有一個拼寫錯誤,所以我糾正它

  public static void convertToUtc() {
    String inputTime = "2018-02-02 10:09:00";
    TimeZone inputTz = TimeZone.getTimeZone("Asia/Jakarta");
    TimeZone utcTz = TimeZone.getTimeZone("UTC");

    SimpleDateFormat inputSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    inputSdf.setTimeZone(inputTz);

    SimpleDateFormat utcSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    utcSdf.setTimeZone(utcTz);

    // From time
    Date fromDate = null;
    try {
      fromDate = inputSdf.parse(inputTime);
    }
    catch (ParseException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    // Convert to UTC
    String sUtcDateTime = utcSdf.format(fromDate);
    System.out.println("UTC: " + sUtcDateTime); // print this UTC: 2018-02-02 03:09:00. 
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM