2014-10-16 79 views
2

我有方法Java的時間格式化

public static void testDateFormat() throws ParseException { 
    DateFormat dateFormat=new SimpleDateFormat("HH:mm:ss"); 
    Date hora; 
    hora=dateFormat.parse("00:00:01"); 
    System.out.println(hora.getHours()+" "+hora.getMinutes()); 
    System.out.println("Date "+hora); 
    System.out.println("Seconds "+TimeUnit.MILLISECONDS.toSeconds(hora.getTime())); 
} 

輸出是

0 0 
Date Thu Jan 01 00:00:01 COT 1970 
Seconds 18001 

爲什麼秒數爲18001?我預計會得到1秒。

回答

5

因爲你的Date有一個不是UTC的TimeZone。實際上,這是UTC-5,即COT。而5 * 60 * 60是18000(或者你的結果,再加上一秒)。爲了得到你所期望的價值,你可以調用DateFormat#setTimeZone(TimeZone)一樣,

DateFormat dateFormat=new SimpleDateFormat("HH:mm:ss"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); // <-- Add this. 
Date hora=dateFormat.parse("00:00:01"); 
System.out.println(hora.getHours()+" "+hora.getMinutes()); 
System.out.println("Date "+hora); 
System.out.println("Seconds "+TimeUnit.MILLISECONDS.toSeconds(hora.getTime())); 

輸出是如您所願。

編輯 正如在評論中指出,Date#getTime()每的Javadoc

返回自1970年1月1日,該Date對象表示00:00:00 GMT毫秒數。

和你的

Thu Jan 01 00:00:01 COT 1970 

Date相當於

Thu Jan 01 00:05:01 UTC 1970 

,因此你會得到5個小時的時差。

+0

而你應該提到的重要細節是'Date'的getTime()'方法返回自從'00:00:00 1/1/1970 UTC'以來的毫秒數 - 這當然是'19:00:00 31/12/1969 COT'。 – 2014-10-16 23:26:25

+0

@DavidWallace編輯。更好? – 2014-10-16 23:42:10

+0

是的。有一個upvote。 – 2014-10-17 00:11:52

0

answer by Elliott Frisch是正確的。

時間只有

但如果你有時間,只是沒有日期或時間區,然後使用日期時庫可以處理該明確,而不是黑客java.util.Date類的工作。

LocalTime

使用無論是Joda-Time庫或java.time包中的Java 8都提供了一個LocalTime類。

LocalTime localTime = LocalTime.parse("00:00:01"); 
int minuteOfHour = localTime.getMinuteOfHour();