2017-06-30 83 views
0

我想獲得當前時間(即IST)和存儲在DB(EST)中的時間的差異。爲了達到這個目的,我想在計算差異之前將當前時間轉換爲EST。但它不工作。在以下方法中,當地時間 不僅僅轉換爲EST。你能否建議我以更好的方式來做到這一點? 的getModifiedDate返回類型是java.sql.Timestamp和列的數據類型 是DATE兩個不同時區的時差

代碼:

Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("EST")); 
cal.setTimeInMillis(System.currentTimeMillis()); 
cal.getTimeInMillis() - emp.getModifiedDate().getTime(); 

我試圖用SimpleDateFormat做到這一點,但我不知道如何進行用這種方法。

如果您可以提供的代碼片段,將有助於

+0

「emp」從哪裏來? – Juan

+0

'emp'是映射到表的實體類'Employee'的obj引用 – Rehman

+0

'emp.getModifiedDate()。getTime();'? –

回答

1

您可以嘗試java.util.TimeZone中

long now = System.currentTimeMillis(); 
    long diff = TimeZone.getTimeZone("IST").getOffset(now) - TimeZone.getTimeZone("EST").getOffset(now); 

的getOffset - 返回在指定的日期

偏移從UTC的時區
+0

它返回10.5小時,但實際的差別是9.5小時 – Rehman

+0

使用getOffset(System。currentTimeMillis())而不是getRawOffset()來考慮DST調整。 – Juan

+0

更正了我的答案考慮DST,謝謝 –

1

我建議使用java.time API​​,這在很大程度上簡化了這一點。考慮下面的例子:

Timestamp t = emp.getModifiedDate(); 
Duration.between(t.toInstant(), ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant()); 

從DB中檢索時間戳已被轉換爲Instant這是在UTC,類似地在Asia/Kolkata區的當前時間已經被轉換爲Instant和兩者之間的Duration一直calculated.You可以從持續時間中檢索所需的信息。

+0

感謝您的幫助帕拉維,但目前我們正在使用java 1.5 – Rehman

+0

1.5,這是舊的,@Rehman。現在有12歲了。如果您有任何升級到Java 6(或更高版本)的機會,您可以使用[ThreeTen Backport](http://www.threeten.org/threetenbp/)和上面的代碼。這是一個很好的答案。 –

2

如果您有權訪問Java 8,則可以直接計算兩個日期之間的差異,而不是首先調整到目標時區。

你可以從java.time包做到這一點使用ZonedDateTime

// Our timestamp 
Timestamp ts = emp.getModifiedDate(); 

// Convert timestamp to ZonedDateTime in the correct time zone 
ZonedDateTime estTime = ts.toLocalDateTime().atZone(ZoneId.of("America/New_York")); 

// Could pass in ZoneId.of("Asia/Kolkata") argument to now(...), but not required 
// as "now" is the same instant in all time zones. 
ZonedDateTime zonedNow = ZonedDateTime.now(); 

// Can use other ChronoUnit values if required. 
long timeDiff = ChronoUnit.MILLIS.between(zonedNow, estTime); 

// Use timeDiff as required 
0

時區有兩個方法getRawOffetgetOffset以毫秒爲單位檢索偏移時區爲UTC。第二個調整爲夏令時並請求日期以檢查它是否有效。

TimeZone current = TimeZone.getDefault(); 
TimeZone db = TimeZone.getTimeZone("US/Eastern"); // or "EST5EDT", or "America/New_York" 
System.out.printf("DB: %s Current: %s\n", db, current); 

System.out.printf("Raw: %.1f h\n", (db.getRawOffset() - current.getRawOffset())/3_600_000D); 

final long now = System.currentTimeMillis(); 
System.out.printf("DST: %.1f h\n", (db.getOffset(now) - current.getOffset(now))/3_600_000D); 
+0

感謝您的回覆卡洛斯。但是對於getOffset()和getRawOffset(),差異返回爲10.5小時,而IST和EST之間的實際差異爲9.5小時 – Rehman

+0

[Wikipedia](https://en.wikipedia.org/wiki/ List_of_time_zone_abbreviations)EST是「UTC-05」,IST是UTC + 5:30--問題是EST不包括夏令時,這將是EDT,正確的應該是EST5EDT,對於這兩種情況。但不建議使用這種縮寫的文件,更好地使用ID作爲「美國/東部」或「美國/紐約」。 –

+0

更改了答案以反映該問題,並以小時而不是毫秒爲單位給出結果 –

相關問題