2013-01-05 56 views
2

我尝试使用SimpleDateFormat格式化时间间隔。SimpleDateFormat无法格式化日期间隔?

import java.text.*; 
import java.util.*; 

public class DateFormatTest { 
    public static void main(String[] args) { 
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 
    long interval = 1000; 
    System.out.println("Interval in millis: " + interval); 
    System.out.println("Expected result: 00:00:01"); 
    System.out.println("Result using Date and SimpleDateFormat: " + 
     sdf.format(new Date(interval))); 
    } 
} 

我得到以下结果:

Interval in millis: 1000 
Expected result: 00:00:01 
Result using Date and SimpleDateFormat: 01:00:01 

我在GMT + 1时区。但它不应该反映在结果中。

当然可以用System.out.printf来解决,但是我正在搜索的是原因。

+2

SimpleDateFormat用于格式化日期,而不是间隔,因此它实际打印的是GMT + 1历元1000毫秒后的正确时间。您应该将SimpleDateFormat的时区设置为UTC –

+0

对于24小时日期格式,也请使用“HH:mm:ss”,而不是“hh:mm:ss”。 hh是一个带有有趣后果的错误。 –

+0

还有一个类似的问题,其中详细介绍了System.out.printf解决方案:[java中的Timemillisecond到hh:mm:ss格式](http://stackoverflow.com/questions/14169873/timemillisecond-to-hhmmss-format- in-java/14169970#14169970) –

回答

3

我在GMT + 1时区。但它不应该反映在结果中。

然后你应该在SimpleDateFormat中设置时区。 SimpleDateFormat是做正是正确的事情 - 这是格式化时间瞬间的时区(午夜UTC 1970年以后只),它的工作在

要更改时区,只需使用:

sdf.setTimeZone(TimeZone.getTimeZone("etc/UTC")); 

尽管如此,您是否应该使用真的仍然使用SimpleDateFormat并不清楚。你不是想格式化一个日期/时间 - 你试图格式区间,给定你的变量名称。

我建议你使用Joda Time具有丰富的类型系统,并允许你表达你真的想要什么。

此外,如果你真的使用SimpleDateFormat,你可能想在你的格式字符串使用HH而不是hh。 (hh是12小时值,1-12,你想要00:00:01,而不是12:00:01)hh很少适合,当你不需要时在你的模式中有一个am/pm指示符。

+0

根据javadoc,这是GMT而不是UTC(虽然它似乎是相同的具体日期)。 – assylias

+1

@assylias:UTC是一个更好的表达,海事组织 - 它并没有绑定到一个地方。在Unix时代使用UTC特别有用,因为人们通常会认为英国在1970年初观察了GMT,实际上并没有。 (有一个去UTC + 1的实验。)我怀疑文档是历史的,但我认为使用UTC通常更清晰。无可否认,UTC只是在1970年后才引入,但...... –

4

我在格林威治标准时间+1时区。但不应该在结果中反映出来。

是什么让你这么想? new Date(0)是在1月1日1970 00:00 AM GMT因此,它是在凌晨01:00,如果您的默认时区为GMT + 1

+0

对不起,我只是想不知何故Date使用本地时区。 –