java - Simpledateformat 解析然后格式化日期不匹配

标签 java date datetime

我遇到了 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/

相关文章:

java - 修改Netty ServerBootstrap ChannelInitializer

c++ - 从 MySQL 检索时间戳数据到 C++

php - 如何在 magento 中将我的时间戳转换为 UTC 时间戳

java - Oracle、JDBI @SqlBatch - 获取 INSERT 触及的所有行

java - jhipster jdl 与微服务导入

java - 将图像加载到Java中的数组中

java - 将日期和时间添加到文件名

php - 来自 mysql 表的时间和日期回显

vb.net - 如何在 DataGridViewColumn 中使用服务器日期时间格式而不是系统日期时间格式

python - 如何保持时间戳的毫秒分量,即使它的值为零?