[英]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"));
}
將timezone
為America/Los_Angeles
以獲取具有正確時區的時間,可以在此處找到時區
java.time
我建議您java.time
使用java.time
,也稱為JSR-310。 您使用的類Date
和SimpleDateFormat
早已過時,尤其是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.