当前位置: 首页 > 知识库问答 >
问题:

与用SimpleDateFormat转换日期混淆[重复]

郭曾笑
2023-03-14

有人能帮忙吗?

String t = "Fri May 19 00:00:00 CEST 2017";
Date d = new SimpleDateFormat("EEE MMM DD hh:mm:ss zzzz YYYY", Locale.US).parse(t);
String s = new SimpleDateFormat("dd.mm.yyyy").format(d).toString();
System.out.println(s);

共有1个答案

东方弘壮
2023-03-14

令人惊讶的结果。古老的类SimpleDateFormat和friends充满了惊喜。这是一件消极的事情。

大写dd是一年中的某一天。小写hh是上午或下午的小时(1到12)。大写yyyy是基于周的年份(仅适用于周号)。所以你要求一个日期是五月的星期五,一年中的第19天。显然这是不可能的。

解析结果为thu Jan 05 23:00:00 CET 2017。显然,SimpleDateFormat选择给您一个星期五,并使用CEST所暗示的2小时区域偏移量,即使它选择的日期不是在一年中使用CEST(夏季时间)的时候。我不知道它是否只是给了你一周为基础的一年的第一个星期五(一年中第一周的星期五)。在GMT+2偏移量的0000小时的星期五等于GMT+1的23点的星期四,这是CET。

接下来的格式设置,05是预期的日期,但小写mm表示分钟。由于分钟数为0,因此得到00。你找对年份了。

我同意Sam的回答,即应该在java.time中使用较新的类,而不是使用给您带来如此惊喜的过时类:

    ZonedDateTime dt = ZonedDateTime.parse(t,
            DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US));
    String s = dt.format(DateTimeFormatter.ofPattern("dd.MM.uuuu"));

这段代码给出了19.05.2017。现代类的一个优点是,如果尝试使用原始格式模式字符串进行解析,将会得到DateTimeParseException,这样您就会知道哪里出了问题。我当然更喜欢异常而不是错误的输出。

 类似资料:
  • 但现在它打印出“SAT 5月18日19:00:00 CDT 2013”(因为我的本地机器在CDT上),但我希望结果是“SAT 5月18日24:00:00 CDT 2013”。如何将日期字符串“1368921600000”解释为EST日期?谢谢-戴夫

  • 问题内容: 将日期转换为其他格式的字符串时遇到问题。日期: 我想将此格式转换为另一种格式:。 当我尝试将其转换时,使用以下方法会得到不同的结果: 我得到了错误的结果,该月已替换为分钟: 问题答案: 这是错误的。这应该是。有关将日期从一种格式转换为另一种格式的更多详细信息,请参见此http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDat

  • 我在将日期转换为不同格式的字符串时遇到了问题。日期: 我想将此格式转换为另一种格式:。 当我尝试转换它时,我会得到不同的结果: 我得到了一个错误的结果,月被替换成了分钟:

  • 我对JavaScript作用域有相当的了解--该语言具有函数级作用域,变量和函数声明被提升到其包含作用域的顶部。但是,我想不通为什么下面两段代码记录了不同的值: 这会将值1记录到控制台: 神秘的是,这记录了10: 那引擎盖下面是怎么回事?

  • 我似乎真的不了解Map和FlatMap。我无法理解的是,for-comprehensiion是如何对map和flatMap的一系列嵌套调用的。以下示例来自 Scala 中的函数式编程 转化为 mkMatcher方法定义如下: 图案方法如下: 如果有人能在这里阐明使用map和flatMap背后的基本原理,那就太好了。