2014-02-14 61 views
3

我希望將long轉換爲long。但是在pc上計算的時間不正確。在Android模擬器上的時間正確計算(仿真器是UTC時間)。請幫助與UTC的時差java

String time = "15:54"; 

Date date = new Date(); 
date.setHours(Integer.parseInt(time.substring(0, 2))); 

long Hours = (date.getTime()/(1000 * 60 * 60)) % 24; 

System.out.print(Hours);      // 14 
System.out.print("\n" + date.getHours());  // 15 

回答

2

當你設置小時Datejava.util.Date對象是獨立的TimeZone概念。每它的javadoc here

儘管Date類打算反映協調世界 時間(UTC),它可能無法做到如此準確,這取決於Java虛擬機的主機 環境。

因此,當您將小時數設置爲15時,日期會解釋您自己的時區並設置小時數。如果UTC(您期望的結果)與您當前的時區有差異,那麼差異會反映在您的案例中(14 vs 15)。

爲了解決這個問題,1個選擇是明確地把自己的時區爲UTC和符合預期的結果:

String time = "15:54"; 

Date date = new Date(); 
java.util.TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // ADDED THIS LINE 
date.setHours(Integer.parseInt(time.substring(0, 2))); 

long hours = (date.getTime()/(60 * 60 * 1000)) % 24; 

System.out.print(hours); // NOW THIS GIVES 15 
System.out.print("\n" + date.getHours()); // 15 

另一個選項是使用Calendar類(如果不是jodatime)的情況下,要準確地解釋TimeZone相關結果。

+0

注意,更改默認的時區是有風險的。影響整個JVM,該JVM中運行的所有軟件將獲得不同的時區。我不會推薦這種方法。 –

0

如果試圖調用方法:

private static String TIME_FORMAT = "HH:mm Z"; 

public static void TestDate(String time_) throws ParseException 
{ 
    SimpleDateFormat format = new SimpleDateFormat(TIME_FORMAT); 
    Date    date = format.parse(time_); 
    long    hours = (date.getTime()/(1000 * 60 * 60)) % 24; 

    System.out.println("The value 'hours' for '" + time_ + "' is '" + Long.toString(hours) + "'"); 

} 

與 「UTC 15:54」,輸出時便會:

The value 'hours' for '15:54 UTC' is '15' 
1

你的問題不明確。

這種日期時間的工作是更容易與Joda-Time庫。

依靠默認的時區很麻煩。相反,請指定您的時區。聽起來就像在你的情況下所需的小時「15」是UTC/GMT(沒有時區偏移)。所以,指定UTC。

你是什麼意思的「長日期轉換」?也許你的意思是在Date(和Joda-Time DateTime)中存儲毫秒以來的紀元。

DateTime now = new DateTime(DateTimeZone.UTC); 
DateTime fifteen = now.withHourOfDay(15); 

轉儲到控制檯...

System.out.println("now: " + now); 
System.out.println("fifteen: " + fifteen); 
System.out.println("fifteen in millis: " + fifteen.getMillis()); 
System.out.println("fifteen's hour-of-day: " + fifteen.getHourOfDay()); 

當運行...

now: 2014-02-14T12:43:00.836Z 
fifteen: 2014-02-14T15:43:00.836Z 
fifteen in millis: 1392392580836 
fifteen's hour-of-day: 15