簡體   English   中英

Java中的Date.getTime()在不同的服務器中返回不同的時間

[英]Date.getTime() in Java returning different time in different server

我需要計算基於日期的值。 因此,我首先使用日期格式類解析日期,然后使用getTime()獲得毫秒。 以這些毫秒為單位,我將計算一些值。 但是getTime()在不同的服務器中返回不同的值。 我們在印度開發,這里我獲得了正確的價值,但是在美國服務器上,我正在獲得不同的價值。

場景:

public class Test {

    public static void main(String[] args) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

        String now = "11/03/2018";

        Date UsualDateformat = sdf.parse(now);

        System.out.println(UsualDateformat.getTime());
    }
}

上面是示例代碼,但是我的實際代碼是drl文件(drools)中的規則。 該程序返回“ 1541183400000”,我將其轉換為日期為“ 2018年11月3日星期六00:00:00”。但是在美國服務器上,即時消息“ 1541217600000”等於日期“ 2018年11月3日星期六09:30:00”。 因此,當我使用此值時,出現邊緣小數點格式問題。 如何解決這個問題?

提前致謝!

您需要在SimpleDateFormat上設置時區,以使不同區域中的服務器之間保持一致。 例如:

public class Test {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        ....
    }

}

您將獲得這些不同的值,因為美國的服務器與印度的服務器之間的時差為9h 30。

這與浮點無關,但與時區無關。

解決此問題的一種方法是始終在同一時區(例如印度)工作

該代碼段可能對您有用,

public static String getGmtTime(String timezone) {
    return ZonedDateTime
            .now()
            .withZoneSameInstant(ZoneId.of(timezone))
            .toLocalDateTime()
            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

timezoneAmerica/Los_Angeles以獲取具有正確時區的時間,可以在此處找到時區

java.time

我建議您java.time使用java.time ,也稱為JSR-310。 您使用的類DateSimpleDateFormat早已過時,尤其是SimpleDateFormat以產生令人驚訝的結果而SimpleDateFormat ,有人說您的情況也是如此。 通常,現代API更好用。

正如我認為您已經懷疑的那樣,問題出在您的服務器運行不同的時區,並且由於時間段始終是同一時間點,因此由於時間段而將日期轉換為毫秒是與時區相關的操作(1970年1月1日在UTC午夜)。 作為mweiss,無論服務器的時區如何,我都使用UTC進行轉換以確保其給出相同的結果:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
    String now = "11/03/2018";
    LocalDate date = LocalDate.parse(now, dtf);
    long millisInUtc = date.atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
    System.out.println(millisInUtc);

就我的代碼而言,它會打印

1541203200000

這在您在印度和美國獲得的值之間,因為UTC在這兩個時區之間。 如果您認為使用例如亞洲/加爾各答時間更正確,只需在代碼中替換ZoneId.of("Asia/Kolkata")而不是ZoneOffset.UTC ,您應該獲得與運行時相同的輸出您在印度服務器上的代碼(請記住也要重命名變量)。

我的代碼比您的代碼長。 在這種情況下,我認為這是一個優勢。 確實是的。 使用java.time的代碼明確表明,我們在一天的開始(午夜0:00)使用時間,並且在轉換時使用時區或偏移量。 這迫使您作為編碼人員考慮這些問題,並且您極不可能編寫會在各個時區產生意外差異的結果的代碼,也就是說,您的問題將永遠不會出現。 同時,它向讀者表明操作取決於時區,並且您已經有意識地選擇了使用哪個時區。 這些優勢非常值得增加一些代碼行。

暫無
暫無

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

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