2011-05-20 58 views
5

我需要將日期從Google App Engine本地服務器時區轉換爲Java中的太平洋時間。將UTC從Java轉換爲Java到PST的日期

我嘗試使用

Calendar calstart = 
Calendar.getInstance(); 

calstart.setTimeZone(TimeZone.getTimeZone("PST")); 
//calstart.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 

Date startTime = calstart.getTime(); 

,但是這給了我不正確的時間(下午4點一些實際時PST是晚上10點)。還嘗試了註釋行America/Los_Angeles,但在GAE服務器上給出了不正確的時間。

任何想法/建議?

+0

請參閱[我回答這個問題(http://stackoverflow.com/questions/847496/java-store-gmt-time/1492766#1492766)。 – 2011-05-20 21:00:56

回答

6

使用Joda Time,您所需要的只是DateTime.withZone方法。示例如下:

public static Date convertJodaTimezone(LocalDateTime date, String srcTz, String destTz) { 
    DateTime srcDateTime = date.toDateTime(DateTimeZone.forID(srcTz)); 
    DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID(destTz)); 
    return dstDateTime.toLocalDateTime().toDateTime().toDate(); 
} 

作爲建議,從不使用默認API進行與時間相關的計算。這太糟糕了。喬達似乎是最好的替代API。

2

除非你需要做一些計算,因此你要格式化這個日期顯示給最終用戶,你可以簡單地使用日期格式:

Date startTime = new Date(); // current date time 
TimeZone pstTimeZone = TimeZone.getTimeZone("America/Los_Angeles"); 
DateFormat formatter = DateFormat.getDateInstance(); // just date, you might want something else 
formatter.setTimeZone(pstTimeZone); 
String formattedDate = formatter.format(startTime); 

但是,如果你真的需要轉換日期(這實在是罕見的),你可能需要使用下面的代碼片段:

TimeZone pacificTimeZone = TimeZone.getTimeZone("America/Los_Angeles"); 
long currentTime = new Date().getTime(); 
long convertedTime = currentTime + 
    pacificTimeZone.getOffset(currentTime); 

這會給你因爲在PST時區1970年1月1日即通過毫秒數。您可以使用此信息輕鬆創建Date對象。
如果您需要經常進行日期計算,您可能需要使用Apache Commons Lang's DateUtils。或者切換到JodaTime作爲mdrg建議。

0

決不依賴於服務器的時區

不能依靠或依賴於服務器或主機JVM當前的默認時區。

請務必明確指定您想要的/預期的時區,並將其作爲可選參數傳遞。

java.time

現在的java.util.Calendar類是傳統的,由java.time類取代。

以UTC獲取當前時刻。 Instant類表示UTC中時間軸上的一個時刻,分辨率爲nanoseconds(小數點後最多九(9)位數字)。

Instant instant = Instant.now(); 

instant.toString():2017-01-19T22:01:21.321Z

當你想通過一個特定區域的wall-clock time的眼鏡來看待那一刻,應用ZoneId得到一個ZonedDateTime

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4個字母的縮寫,如EST或或IST,因爲它們不真正時區,不規範,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime zdt = instant.atZone(z); 

zdt.toString():2017-01-19T14:01:21.321-08:00 [美國/洛杉磯]


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore