2015-05-24 82 views
0

我只是做两个不同的日历两个timemilisseconds简单的区别。日历之间的java差异

实施例:

Calendar ini = Calendar.getInstance(); 
    try { 
     Thread.sleep(1500); 
    } catch (InterruptedException e) {e.printStackTrace();} 

    Calendar end = Calendar.getInstance(); 
    long diff = end.getTimeInMillis()-ini.getTimeInMillis(); 
    System.out.println("diff "+diff); 
    System.out.println("ini date "+ ini.getTime()); 
    System.out.println("end date "+ end.getTime()); 
    System.out.println("diff time format "+timeFormat.format(diff)); 

时间的格式为:

private final static String TIME_STRING_FORMAT = "hh:mm:ss.SSS"; 
private static SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_STRING_FORMAT); 

,并在输出,总是出现1我们的差异,是它的的SimpleDateFormat的问题???

输出:

diff 1500 
ini date Sun May 24 22:27:01 CEST 2015 
end date Sun May 24 22:27:03 CEST 2015 
diff time format 01:00:01.500 

感谢您的帮助!

+3

我不知道任何'SimpleDateFormat#format'重载接收'long'解析。请提供确切的代码来复制您的问题。 –

回答

2

看起来像SimpleDateFormat使用时区。见this related question。所以当你给它一个1500毫秒的时间时,它认为你给它是从格林威治标准时间开始时代开始的时间。然后将其转换为您的时区,给您一些小时的抵消。您可能希望将timeFormat的时区设置为GMT。试试这个:

Calendar ini = Calendar.getInstance(); 
    try { 
     Thread.sleep(1500); 
    } catch (InterruptedException e) {e.printStackTrace();} 

    Calendar end = Calendar.getInstance(); 
    long diff = end.getTimeInMillis()-ini.getTimeInMillis(); 
    System.out.println("diff "+diff); 
    System.out.println("ini date "+ ini.getTime()); 
    System.out.println("end date "+ end.getTime()); 
    Date date = new Date(diff); 
    System.out.println(date); 
    timeFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 
    System.out.println("diff time format "+timeFormat.format(date)); 
+0

更改SimpleDateFormat工作中的时区。 +1用于解释错误来自何处。 – goncalotomas

2

1小时的差异是由您当地的时区造成的。 1970年1月1日格林尼治标准时间后,建立日期为毫秒数。在欧洲大陆(在冬季),因此在1月1日01:00:01.500之后1500毫秒。

如果您使用Java 8,请参阅Period and Duration上的教程。 Duration可能是你想要使用的。

+1

是的。避免使用java.util.Date/.Calendar和SimpleDateFormat。使用内置于Java 8及更高版本的java.time包,或者使用Joda-Time。 –

+0

听起来不错,但我不能在Android中使用它:)任何想法?谢谢! – jurmeneta