将日历对象转换为java格式的字符串,格式为"yyyy-mm-dd hh:mm:ss"

and*_*ath 7 java datetime

我正在将一个日历对象中存储的日期转换为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());
Run Code Online (Sandbox Code Playgroud)

现在,该字符串的,而不是"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)几个小时)但它没有奏效.

我想我应该设置一些其他领域,或者可能还有另一种方法......任何想法?

pol*_*nts 8

Calendar.JANUARY实际上0,不是1.

当您提供01在当月领域set,你实际上设置月至2月,这就是为什么你02SimpleDateFormat它呈现为MM.

当您使用任何Calendar.get/set方法时,您必须采取额外的预防措施,以确保您了解"自然的"基于1的索引与更"笨拙" Calendar的基于0的索引之间的差异.每当你获得/设定一个月的时候Calendar,总有这种可能会导致严重的错误.

这只是其中一个非常尴尬的设计,Calendar因此有很多不足之处.其中一个更好,更愉快的日期/时间API库是Joda Time,所以如果可能的话,你可以考虑转换到那个库.

API链接

  • Calendar.MONTH- "对于现场数getset.指示一个月这是一个特定于日历的值一年的第一个月[...]时,JANUARY即0".
  • Calendar.set(…, int month, …)- " month- 用于设置MONTH日历字段的值.月值为0,例如,1表示0."

八进制文字

另外,请注意,01它实际上是八进制文字(即基数为8).你不应该养成前缀0为整数文字(§3.10.1)的习惯,因为它们会导致细微的错误/错误,除非你非常小心.

例如,int i = 09;是非法的Java代码.

    System.out.println(010); // prints 8, not 10
Run Code Online (Sandbox Code Playgroud)

也可以看看