Java的时间格式化

问题描述:

我有方法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秒。

因为你的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

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();