解析字符串日期到目前为止

时间:2014-07-15 00:23:17

标签: java parsing date date-formatting

我有一个日期字符串,格式为“YYYY-MM-dd HH :: mm:ss”。每当我解析字符串时,我的日期都会错误。(“Sun Dec 29 10:10:10 CET 2013”​​)。代码如下:

DateFormat timeFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Date startDate = timeFormat.parse("2014-08-10 10:10:10");
System.out.println(startDate);

这将返回“Sun Dec 29 10:10:10 CET 2013”​​。如何正确解析日期字符串?

2 个答案:

答案 0 :(得分:2)

您需要使用YYYY

,而非使用yyyy

Y指的是WEEK_YEAR,而y指的是YEAR。 WEEK_YEAR基于一年中第一个完整周开始的时间(这取决于设置),因此与YEAR略有不同(有时甚至是很大)。

请参阅javadoc: http://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html#week_year

答案 1 :(得分:0)

您使用的格式错误。您需要yyyy而不是YYYY

如果你看一下SimpleDateFormat documentation,你会发现

y   Year
Y   Week year

其中“week year”与WEEK_OF_YEAR周期同步。

现在,为什么YYYY返回2013年2014年?

要回答这个问题,您需要了解日历如何确定该周属于某一年。规则很简单:

  • 周属于XXXX年,如果本周的最后N天(通常N = 4,但由getMinimalDaysInFirstWeek使用的日历确定)属于XXXX年
  • 周开始于getFirstDayOfWeek的结果。此结果取决于Locale,但在下一个示例中,我们将使用星期一作为一周的第一天。

示例1。

假设一周的第一天是星期一,并且一周所需的天数属于某一年是4让我们尝试确定哪一周是一年中第一年的XXXX,如下所示:

       January XXXX
Mon Tue Wed Thu Fri Sat Sun 
 27  28  29  30  31   1   2
  3   4   5   6   7   8   9
...

第一行的周仅包含两天,属于XXXX年(至1月),第1行和第2行

 27  28  29  30  31   1   2
                    ^^^ ^^^  //days which belong to January

但这比本周属于XXXX年而下周所需的天数少

  3   4   5   6   7   8   9

包含属于XXXX年的7天。由于第一行中的周不属于XXXX 第一周 周年将于1月3日XXXX开始。这意味着,如果我们使用格式XXXX解析值YYYY,我们将获得3rd January XXXX

示例2。

现在让我们说XXXX年的日历看起来像这样

       January XXXX
Mon Tue Wed Thu Fri Sat Sun 
 30  31   1   2   3   4   5
  6   7   8   9  10  11  12
...

正如你在周看到的那样

 30  31   1   2   3   4   5

最近5天属于XXXX年,超过了所需的4天时间   - >这意味着本周属于XXXX年,
  - >这也是XXXX年的第一周   - >这意味着今年的第一周从30 December (XXXX-1)开始   - >这最终意味着如果您使用YYYY格式解析这一年,您将获得XXXX-1的价值。


示例2 实际上是年2014的情况,这就是为什么年被解释为年2013

顺便说一句,如果您决定使用周年格式设置月和日,您还需要使用可描述的特殊格式

  • 您想要设置的一年中的哪一周
  • 以及哪一天

因此,您必须使用

而不是Md
w   Week in year
u   Day number of week (1 = Monday, ..., 7 = Sunday)

(小时,分钟,秒是时间的一部分,而不是日期,因此H ms在此格式中可以正常使用)

例如

DateFormat format = new SimpleDateFormat("YYYY-ww-uu HH:mm:ss");
Date date = format.parse("2004-53-7 10:10:10");
System.out.println(date);

将被解析为Sun Jan 02 10:10:10 CET 2005