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

将日历对象转换为java格式的字符串;yyyy mm dd hh:mm:ss“;,java,datetime,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-d

我正在将存储在日历对象中的日期转换为字符串,用于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”。 我已经检查了解析器公式中可能存在的错误(例如,月份的大写MM或小时的大写HH),但它不起作用

我想我应该设置一些其他字段,或者可能有另一种方法。。。有什么想法吗?

实际上是
0
,而不是
1

当您在
set
中为月份字段提供
01
时,实际上是将月份设置为二月,这就是为什么当
SimpleDateFormat
将其呈现为
MM
时,您会得到
02

使用任何
Calendar.get/set
方法时,必须采取额外的预防措施,以确保您意识到“自然”1基索引与更“笨拙”的
Calendar
0基索引之间的差异。任何时候,当您获取/设置
日历的月份时,都有可能导致严重的错误

这只是其中一个非常尴尬的设计,留下了很多需要改进的地方。其中一个更好的、更令人愉快的日期/时间API库是可用的,所以如果可能的话,您可以考虑切换到那个库。 API链接
  • -“表示月份的
    get
    set
    字段号。这是一个特定于日历的值。一年的第一个月[…]是
    一月,即0”
  • -“
    month
    -用于设置
    month
    日历字段的值。month值以0为基础。例如,1月份为0。”

关于八进制文字 另外,请注意,
01
实际上是一个八进制文字(即)。您不应该养成将
0
前置为整数文本()的习惯,因为除非您非常小心,否则它们可能会导致细微的错误

例如,
inti=09
是非法的Java代码

    System.out.println(010); // prints 8, not 10
另见

    • 只是从
      0
      开始的几个月(而不是
      1


      也就是说,您不应该为了在数据库中插入日期而转换为字符串。您可以使用时间戳,也可以与

      一起使用。Java编码惯例是使用小写首字母作为变量名,例如
      timeStop
      。Danke!这意味着日历从“0”开始,而解析器从“1”开始。。。好的,谢谢你的另一封信comment@andystrath:对于
      java.util.Calendar
      的月份字段,是的,它从
      0
      开始。这就是为什么当你
      月份设置为
      1
      时,实际上是
      二月
      ,这是
      02
      格式的
      MM
      (关于数据库内容)+1来自我;我不知道确切的细节,但这听起来更明智。