簡體   English   中英

在Java中為所有時區保存日期時間

[英]Saving date time for all time zones in java

我有一個應用程序,用戶可以在其中創建問題,其他人可以使用它查看日期時間(創建問題時)。 現在我獲取服務器日期時間並將其保存在db中,但問題是居住在有6-7小時間隔的國家/地區的人使用了app。 很好的一個小例子是,我住在某個國家,我在晚上7:00提出問題,但在美國的時間是上午11點(只是一個猜測)。 因此,用戶可以立即檢索問題,但是對他來說,問題時間應該是上午11點而不是晚上7點。 所以我該如何保存日期時間,以便所有時區都一樣。 我有點困惑,所以我需要一點幫助。 我知道這與UTC日期時間有關,但是有人可以詳細說明一下:)。 感謝你

所以我該如何保存日期時間,以便所有時區都相同

您應該使用UTC存儲日期,因此,如果有人在+1時區使用您的應用,則需要先將其轉換為UTC。 時區僅應用於向用戶顯示時間。

存儲到數據庫中的差異,以毫秒為單位,當前時間和與時代午夜,1970年1月1日UTC。 可以通過調用System.currentTimeMillis()

有了它后,就可以在所需的任何時區中提供時間,這是一個簡單的代碼段,顯示了我的機器上所有可用時區的時間

此代碼使用Java 8及更高版本中內置的java.time框架。 許多功能也已反向移植到Java 6和7以及Android中

long time = System.currentTimeMillis();
Instant instant = Instant.ofEpochMilli(time);
ZoneId.getAvailableZoneIds().stream().forEach(id -> {
        ZoneId zId = ZoneId.of(id);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zId);
        System.out.printf(
            "The current time in %s is %s%n",  
            zId, localDateTime.format(DateTimeFormatter.ISO_DATE_TIME)
        );
    }
);

這與舊版Java是等效的:

long time = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
for (String id : TimeZone.getAvailableIDs()) {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    formatter.setTimeZone(TimeZone.getTimeZone(id));
    System.out.printf(
        "The current time in %s is %s%n",  id, formatter.format(cal.getTime())
    );
}

回應更新:

當您想要保留原始的TimeZone ,還必須以偽標准格式GMT +/- mm:ss將時區ID存儲到數據庫中。

為此,首先需要獲取與UTC時間相比的增量(在tz下面的代碼段中是我當前的TimeZone):

int offsetFromUTC = tz.getOffset(time);

然后,您可以將以毫秒為單位的此增量轉換為預期的時區ID,可以這樣進行:

String timeZoneId = String.format(
    "GMT%+02d:%02d", offsetFromUTC / (60 * 60 * 1000), offsetFromUTC / (60 * 1000) % 60
);

timeZoneId的值是您必須存儲到數據庫中的第二個值。 使用這兩個值,可以以任何期望的格式顯示時間,例如:

Calendar cal = Calendar.getInstance();
// Here I use the time retrieved from the DB
cal.setTimeInMillis(time);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
// Here I use the time zone id retrieved from the DB
TimeZone tz = TimeZone.getTimeZone(timeZoneId);
formatter.setTimeZone(tz);
System.out.printf("The current time in %s is %s%n",  id, formatter.format(cal.getTime()));

暫無
暫無

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

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