将日历对象转换为java格式的字符串,格式为“yyyy-mm-dd hh:mm:ss”
我正在将字符串中存储在日历对象中的日期转换为MySQL中的查询。 我需要格式为“yyyy-MM-dd HH:mm:ss”的字符串,即:“2010-01-01 15:30:00”。 我正在使用如下代码:
Calendar TimeStop = Calendar.getInstance(); TimeStop.set(2010, 01, 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上检查了解析器公式中可能存在的错误(例如,月份或资本HH的资本MM)几个小时)但它没有奏效。
我想我应该设置一些其他领域,或者可能还有另一种方法……任何想法?
Calendar.JANUARY
实际上是0
,而不是1
。
当您为set
的月份字段提供01
,您实际上将月份设置为2月,这就是当SimpleDateFormat
将其呈现为MM
时获得02
原因。
当您使用任何Calendar.get/set
方法时,您必须采取额外的预防措施,以确保您了解“自然的”基于1的索引与更“笨拙”的基于0的Calendar
之间的差异索引。 每当你获得/设置Calendar
的月份时,总有这种可能导致严重的错误。
这只是Calendar
中那些非常笨拙的设计之一,还有很多不足之处。 其中一个更好,更令人愉快的日期/时间API库是Joda Time ,所以如果可能的话,你可以考虑切换到那个库。
API链接
-
Calendar.MONTH
– “get
和set
字段编号,表示月份。这是特定于日历的值。一年中的第一个月是…”,即“0”。 -
Calendar.set(…, int month, …)
– “month
– 用于设置MONTH
日历字段的值。月值为0,例如,0表示1月。”
八进制文字
另外,请注意01
实际上是八进制文字(即基数为8 )。 你不应该养成将0
添加到整数文字( §3.10.1 )的习惯,因为它们会导致细微的错误/错误,除非你非常小心。
例如, int i = 09;
是一个非法的Java代码。
System.out.println(010); // prints 8, not 10
也可以看看
- 我可以在Eclipse中自定义语法高亮显示以不同方式显示八进制文字吗?
- 八进制数字文字:什么时候? 为什么? 永远不会消失?
只是几个月从0
开始(不是1
)
也就是说,您不应该转换为字符串,以便在数据库中插入日期。 您可以将时间戳或java.sql.Date
与PreparedStatement
一起使用