我有一个日期字符串,格式为“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”。如何正确解析日期字符串?
答案 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
年?
要回答这个问题,您需要了解日历如何确定该周属于某一年。规则很简单:
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
。
因此,您必须使用
而不是M
和d
w Week in year
u Day number of week (1 = Monday, ..., 7 = Sunday)
(小时,分钟,秒是时间的一部分,而不是日期,因此H
m
和s
在此格式中可以正常使用)
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