2012-11-29 14 views
3

我需要兩樣東西:爪哇 - 電流轉換成日期UTC和UTC在任何時區

  1. 轉換當前時間爲UTC(這樣我就可以存儲在UTC格式日期) - >結果= java的.util.Date。

  2. 轉換加載日期(UTC格式)轉換成任意的時區 - >結果= java.util.Date或毫秒

對於這兩點,都要考慮到日光。

1) 我發現了以下計算器:

Calendar c = Calendar.getInstance(); 
System.out.println("current: "+c.getTime()); 

TimeZone z = c.getTimeZone(); 
int offset = z.getRawOffset(); 
if(z.inDaylightTime(new Date())){ 
    offset = offset + z.getDSTSavings(); 
} 
int offsetHrs = offset/1000/60/60; 
int offsetMins = offset/1000/60 % 60; 

System.out.println("offset: " + offsetHrs); 
System.out.println("offset: " + offsetMins); 

c.add(Calendar.HOUR_OF_DAY, (-offsetHrs)); 
c.add(Calendar.MINUTE, (-offsetMins)); 

System.out.println("GMT Time: "+c.getTime()); 

- >結果等於UTC?

2)

public static long getTimeMillisFromTimeZone(long utcTimeMillis, 
     String timeZoneId) { 
    System.out.println("input millis: " + utcTimeMillis); 
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
    calendar.setTimeInMillis(utcTimeMillis); 
    TimeZone fromTimeZone = calendar.getTimeZone(); 
    TimeZone toTimeZone = TimeZone.getTimeZone(timeZoneId); 

    calendar.setTimeZone(fromTimeZone); 
    calendar.add(Calendar.MILLISECOND, fromTimeZone.getRawOffset() * -1); 
    if (fromTimeZone.inDaylightTime(calendar.getTime())) { 
     calendar.add(Calendar.MILLISECOND, calendar.getTimeZone() 
       .getDSTSavings() * -1); 
    } 

    calendar.add(Calendar.MILLISECOND, toTimeZone.getRawOffset()); 
    if (toTimeZone.inDaylightTime(calendar.getTime())) { 
     calendar.add(Calendar.MILLISECOND, toTimeZone.getDSTSavings()); 
    } 

    System.out.println(calendar.getTime()); 

    System.out.println("output millis: " + calendar.getTime().getTime()); 
    return calendar.getTime().getTime(); 
} 

- >我有一個問題存在 - >丟失1H!

在我的例子中,我將TimeZone「Europe/Vienna」(使用daylight)的日期作爲utc存儲到數據庫中。現在我想把這個UTC(09:00)轉換成「歐洲/維也納」,我得到了:09:00 =我輸了一小時..

+0

可能重複[我怎樣才能得到當前日期和時間在UTC或GMT在Java?](http://stackoverflow.com/questions/308683/how-can-i-get-the-current-date-and-time-in-utc-or-gmt -in-java) –

回答

2

您是否想過只使用現有的DateTime API,如Joda

UPDATE

  1. 已經回答:Joda Time - different between timezones

  2. 將是相同的我想只是使用withZone

+0

我同意C Vogel - Joda時間對於這些要求來說非常棒。 – mmalmeida

+0

你能給我一個喬達的解決方案嗎? – user1731299

+0

看看我的更新的答案 –

0

請嘗試以下代碼(我用約達時間)在時區之間轉換日期S:

public static Date convertDate(Date sourceDate, DateTimeZone sourceTimeZone, DateTimeZone resultTimeZone) { 
    LocalDateTime localDateTime = new LocalDateTime(date.getTime()); 
    DateTime sourceDateTime = localDateTime.toDateTime(sourceTimeZone); 
    DateTime resultDateTime = sourceDateTime.withZone(resultTimeZone); 
    return resultDateTime.toLocalDateTime().toDateTime().toDate(); 
} 

轉換爲UTC可以簡化爲:

public static Date toUtcDate(Date sourceDate, DateTimeZone sourceTimeZone) { 
    return convertDate(sourceDate, sourceTimeZone, DateTimeZone.UTC); 
} 

此調用成功增加1小時對我來說:

convertDate(new Date(), DateTimeZone.UTC, DateTimeZone.forID("Europe/Vienna")); 
+1

嗯,我嘗試使用你的方法。首先我得到了utc日期格式'toUTcDate',它沒有返回正確的值(+ 1小時)之後,我嘗試了'convertDate',但是它沒有區別我試過的目標時區 - 我總是得到相同的日期返回。 – user1731299

+1

我現在看到了..確定它能正常工作,將盡快更新答案 – udalmik

+0

請嘗試更新一個 – udalmik