【问题标题】:converting a calendar object into a string in java with format "yyyy-mm-dd hh:mm:ss"在java中将日历对象转换为格式为“yyyy-mm-dd hh:mm:ss”的字符串
【发布时间】:2011-04-04 17:54:26
【问题描述】:

我正在将存储在日历对象中的日期转换为 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 上检查了解析器公式中可能存在的错误(例如,大写的 MM 表示月份或大写的 HH 表示小时),但它没有用。

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

【问题讨论】:

  • Java 编码约定是使用小写首字母作为变量名,例如timeStop.

标签: java datetime


【解决方案1】:

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

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

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

这只是Calendar 中那些非常尴尬的设计之一,还有很多不足之处。 Joda Time 是目前可用的更好、更令人愉快的日期/时间 API 库之一,因此如果可能,您可以考虑改用该库。

API 链接

  • Calendar.MONTH - “getset 的字段编号表示月份。这是一个特定于日历的值。一年中的第一个月 [...] 是 JANUARY,即 0”。
  • Calendar.set(…, int month, …) - “month - 用于设置 MONTH 日历字段的值。月份值基于 0。例如,0 表示一月。”

关于八进制文字

另外,请注意01 实际上是一个八进制文字(即base 8)。您不应该养成在整数文字 (§3.10.1) 之前添加 0 的习惯,因为除非您非常小心,否则它们可能会导致细微的错误/错误。

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

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

另见

【讨论】:

  • 当客!这意味着日历从“0”开始,但解析器从“1”开始......好的,也谢谢你的其他评论
  • @andystrath:对于java.util.Calendar的月份字段,是的,它从0开始。这就是为什么当您将月份set 转换为1 时,它实际上是February,即02 MM 格式。
【解决方案2】:

只是从0(不是1)开始的那几个月

也就是说,您不应转换为字符串以便在数据库中插入日期。您可以使用时间戳,也可以将java.sql.DatePreparedStatement 一起使用

【讨论】:

  • (关于数据库的东西)+1 来自我;我不知道确切的细节,但这听起来确实是更明智的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2016-11-06
相关资源
最近更新 更多