将毫秒格式化为SimpleDateFormat格式

5
我在将毫秒格式化为SimpleDate格式时遇到了奇怪的结果:
输出为:
    Start date time: 11/06/30 09:45:48:970
    End date time: 11/06/30 09:45:52:831
    Execution time: 01:00:03:861

脚本:

    long dateTimeStart = System.currentTimeMillis();    
    // some script execution here
    long dateTimeEnd = System.currentTimeMillis();

    "Start date time: " + GlobalUtilities.getDate(dateTimeStart, "yy/MM/dd hh:mm:ss:SSS"); 
    "End date time: " + GlobalUtilities.getDate(dateTimeEnd, "yy/MM/dd hh:mm:ss:SSS"); 
    "Execution time: " + GlobalUtilities.getDate((dateTimeEnd - dateTimeStart), "hh:mm:ss:SSS");

方法:

    public static String getDate(long milliseconds, String format)
    {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(milliseconds);
    }

任何想法为什么执行时间值会如此偏离?它应该是00:00:03:861,而不是01:00:03:861。
谢谢。
2个回答

3

由于您将时差转换成日期,所以出现了这种情况。

  1. SimpleDateFormat.format(long milliseconds) 计算日期:Unix出生时间+毫秒数。
  2. 此时间还根据与格林威治标准时间的时差进行调整。
  3. 有了这两个信息,您就得到了奇怪的结果。要验证上述信息,您可以将天、月和年份加到日期中。

不幸的是,您只能通过手动转换时间来修复该问题。


1

执行时间不准确,因为Date构造函数需要一个长整型参数,指定自1970年01月01日以来的毫秒数。


2
这是另一个StackOverflow答案,提供了一些非常好的想法!https://dev59.com/RHRB5IYBdhLWcg3wbGxB - Daniel Lundmark
另外,顺便提一下,当处理Java日期时,我真的可以推荐JodaTime API。它比内置的Java日期要好得多。http://joda-time.sourceforge.net/ - Daniel Lundmark
如果您坚持使用日期格式化程序,请尝试以下方法(将x替换为您的值): Calendar cal = Calendar.getInstance(); cal.clear(); cal.set(Calendar.MILLISECOND, x);SimpleDateFormat sdf2 = new SimpleDateFormat("hh:mm:ss.SSS"); System.out.println(sdf2.format(cal.getTime())); - Steve Brisk
然后将日期转换为SimpleDateFormat中的日历。日历还考虑时区和夏令时,所以如果你在欧洲工作,你会少1小时。 - Kennet
谢谢链接,Daniel。这很有帮助。 - user706058

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接