将日历对象转换为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,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?

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...