【发布时间】:2016-04-13 23:51:16
【问题描述】:
这开始是一个简单的错误:我的SimpleDateFormat 对象的格式字符串中有YYYY 而不是yyyy。但是我对使用不正确格式字符串的测试结果完全感到困惑。
这段代码:
@Test
public void whatTheHell() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/YYYY");
Date d1 = sdf.parse("01/07/2016");
Date d2 = sdf.parse("02/08/2016");
Date d3 = sdf.parse("11/29/2027");
System.out.println(d1.toString());
System.out.println(d2.toString());
System.out.println(d3.toString());
} catch (ParseException pe) {
fail("ParseException: " + pe.getMessage());
}
}
产生这个输出:
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2015
Sun Dec 27 00:00:00 PST 2026
我在这里阅读了关于“Y”参数的文档:https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html,但我仍然看不到这里的逻辑。特别是最后一个例子:我可以理解如何将 1 月(可能是 2 月)的日期转换为上一年的 12 月,但是将 11 月 29 日的日期向后移动 11 个月让我感到困惑。 12 月 27 日有什么特别之处?
谁能解释一下?
更多信息
@Jan 建议依赖 toString() 方法可能会出现问题,因此我定义了一个日期格式以在与上面相同的代码中打印 YYYY MM dd '-' yyyy MM dd。这是附加输出:
2016 12 27 - 2015 12 27
2016 12 27 - 2015 12 27
2027 12 27 - 2026 12 27
【问题讨论】:
-
依靠 toString() 来呈现有用的东西也是乐观的。您可能希望使用不同的 DateFormat 进行输出。像一个同时包含 yyyy 和 YYYY 的?
-
年与周年的解释见here
-
@theo 谢谢,但这仅说明日期在一年中的第一周或最后一周时的变化,这仅可能是我的三个示例中的第一个。
-
@Jan:好主意,但是使用格式字符串为
yyyy YYYY的格式会得到一致的结果:#1 和#2 都给出2016 2015,而#3 给出2027 2026。这不会让我们到任何地方。 -
但是输出的 DateFormat 是否确认日期是 12 月 27 日?
标签: java simpledateformat