0

当我这样做时:

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);

我明白了:99 年 12 月 30 日下午 18.00.00.000000318

如何获得我想要的时间?

4

2 回答 2

3

在执行格式化之前,您还需要设置格式化程序的时区

formatter.setTimeZone(c.getTimeZone());

否则它将使用平台默认时区。


与具体问题无关,日历不保持纳秒,因此格式化后该部分可能仍然有点偏离。

于 2013-01-18T18:02:23.390 回答
0

您正在创建一个SimpleDateFormatter没有指定时区的 - 因此默认情况下它将使用系统本地时区。如果您希望格式化程序也使用 UTC,只需设置它。

请注意,一个Date值与时区无关——它只是自 Unix 纪元以来的毫秒数。它不知道最初用于创建它的时区。这就是为什么您需要调用setTimeZone格式化程序(或使用带区域的构造函数)。

毫秒中的 318 表明您的原始Date值包含 318 的毫秒分量。java.util.Date无论如何 A 仅支持毫秒的分辨率,因此您应该SSS000000在格式中使用...并且无论如何您都应该将毫秒值设置为 0:

c.set(Calendar.MILLISECOND, 0);

(令人讨厌的是,设置“年、月、日、小时、分钟、秒”不会重置毫秒值。对我来说似乎很疯狂,但是......)

附带说明一下,内置的 Java 日期/时间 API 在各个方面都非常糟糕。您可能很想考虑使用Joda Time来代替......

于 2013-01-18T18:02:34.393 回答