如何将Java日历设置为特定的UTC时间?

时间:2013-01-18 17:58:13

标签: java calendar

当我这样做时:

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

我如何得到我想要的时间?

2 个答案:

答案 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代替...