我遇到了 SimpleDateFormat 的奇怪行为,我不知道如何处理。
我需要解析特定格式的日期(星期几,然后是日,然后是月,然后是年,然后是时间)。 然而,当解析日期给我一个非常奇怪的结果(其他日期)时,我遇到了一种行为。这是一个小型的独立示例,它在我的机器上输出。
public static void main(String[] args) throws Exception {
test("E YYYY kk:mm:ss");
test("E d YYYY kk:mm:ss");
test("E d MMMM YYYY kk:mm:ss");
}
public static void test(String format) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date now = new Date();
System.out.println(now);
String formattedNow = sdf.format(now);
System.out.println(formattedNow);
Date parsedFormattedNow = sdf.parse(formattedNow);
String formattedParsedNow = sdf.format(parsedFormattedNow);
System.out.println(formattedParsedNow);
System.out.println(formattedNow.equals(formattedParsedNow));
}
输出:
Sat Apr 27 13:48:07 MSK 2013
Sat 2013 13:48:07
Sat 2013 13:48:07
true
Sat Apr 27 13:48:07 MSK 2013
Sat 27 2013 13:48:07
Sat 5 2013 13:48:07
false
Sat Apr 27 13:48:07 MSK 2013
Sat 27 April 2013 13:48:07
Sat 5 January 2013 13:48:07
false
为什么27会变成5,4月会变成1月?
最佳答案
嗯,这里有两个方面:
- 模式
E d YYYY kk:mm:ss
根本不包含月份指示符。那么,在格式化为“Sat 27 2013 13:48:07”之后,您期望解析部分如何计算出该月的结果? - 您的所有模式都使用
YYYY
,这是周年,而不是日历年。这通常应与“星期几、星期-年”模式一起使用。如果您改用yyyy
,最终的模式将会起作用。
第一个模式似乎起作用的唯一原因是,除了“星期几”和年份(当然还有时间)之外,您实际上没有设置任何其他内容。如果打印出 parsedFormattedNow
(没有其他格式),您将看到解析结果实际上是 1 月 5 日。只是你没有注意到,因为今天还是星期六。
关于java - Simpledateformat 解析然后格式化日期不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16250629/