当我这样做时:
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
c.set(9999, 11, 31, 0, 0, 0);
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSSSSS a");
String date = formatter.format(c.getTime());
assertEquals("31-Dec-99 00.00.00.000000000 AM", date);
我明白了:30-Dec-99 18.00.00.000000318 PM
我如何得到我想要的时间?
答案 0 :(得分:3)
在执行格式之前,您还需要设置formatter's time zone。
formatter.setTimeZone(c.getTimeZone());
否则它将使用平台默认时区。
无关,日历不会保持纳秒级,因此格式化后该部分可能仍然有点不合适。
答案 1 :(得分:0)
您正在创建SimpleDateFormatter
而未指定时区 - 因此默认情况下它将使用系统本地时区。如果您希望格式化程序也使用UTC,只需设置它即可。
请注意,Date
值与时区无关 - 它只是 自Unix纪元以来的毫秒数。它不知道最初用于创建它的时区。这就是为什么你需要在格式化程序上调用setTimeZone
(或使用带区域的构造函数)。
以毫秒为单位的318表示原始Date
值包含一个318的毫秒分量。java.util.Date
仅支持毫秒的分辨率,所以你应该在你的SSS000000
中使用c.set(Calendar.MILLISECOND, 0);
format ...你应该将毫秒值设置为0:
{{1}}
(令人讨厌的是,设置“年,月,日,小时,分钟,秒”不会重置毫秒值。对我来说似乎很疯狂,但是......)
作为旁注,内置的Java日期/时间API在各方面都非常严峻。您可能希望使用Joda Time代替...