我正在使用如下代码:
Calendar TimeStop = Calendar.getInstance(); TimeStop.set(2010,01,15,30,0); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String TimeStop_Str = sdf.format(TimeStop.getTime());
现在,字符串,而不是像我期望的那样“2010-01-01 15:30:00”是“2010-02-01 15:30:00”.
我已经在http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html上检查了解析器公式中可能存在的错误(例如,月份的资本MM或小时的资本HH),但它没有奏效.
我想我应该设置一些其他领域,或者可能还有另一种方法……任何想法?
解决方法
Calendar.JANUARY
实际上是0,而不是1.
当您为集合中的月份字段提供01时,您实际上将月份设置为2月,这就是当SimpleDateFormat将其呈现为MM时获得02的原因.
当您使用任何Calendar.get / set方法时,您必须采取额外的预防措施,以确保您了解“自然的”基于1的索引与更“笨拙”的基于0的索引之间的差异.每当你获得/设置日历的月份时,总有这种可能导致严重的错误.
这只是Calendar
中那些非常笨拙的设计之一,还有很多不足之处.其中一个更好,更令人愉快的日期/时间API库是Joda Time,所以如果可能的话,您可以考虑切换到该库.
API链接
> Calendar.MONTH
– “获取和设置的字段编号,表示月份.这是特定于日历的值.一年中的第一个月是1月,即0”.
> Calendar.set(…,int month,…)
– “month – 用于设置MONTH日历字段的值.月值为0,例如,0表示1月.”
八进制文字
另外,请注意01实际上是八进制文字(即base 8).你不应该养成将0添加到整数文字(§3.10.1)的习惯,因为它们会导致细微的错误/错误,除非你非常小心.
例如,int i = 09;是一个非法的Java代码.
System.out.println(010); // prints 8,not 10
也可以看看
> Can I customize syntax highlighting in Eclipse to show octal literals differently?
> Octal number literals: when? why? ever?