【问题标题】:SimpleDateFormat Ignore CharactersSimpleDateFormat 忽略字符
【发布时间】:2015-11-06 21:23:35
【问题描述】:

我正在使用SimpleDateFormat,我从两个不同的来源获得结果。一个来源使用"yyyy-MM-dd HH:mm:ss" 格式,而另一个使用"yyyy-MM-ddTHH:mm:ssZ"。我对从第二种格式获取时区('Z'值)不感兴趣,有没有一种方法可以在不使用不同格式字符串的情况下获取这些时间?会忽略中间字符以及'ss' 之后的字符。

【问题讨论】:

  • 只是改变字符串以在秒后截断它,并将日期和时间之间的部分标准化?
  • 您确定不想要那个Z 吗?它标志着时间是相对于 UTC 的。没有它,日期将被解释为就好像它在您当前的时区,尽管来源基于 UTC 提供它。您确定这不会导致您记录错误的时间吗?
  • @JonSkeet 我知道我可以做到,但我正在尝试使用 GSON 简化我的代码。因此,首先获取字符串,对其进行变异,然后将其放回 JSON 字符串将是非常违反直觉的。我可能只需要使用两个单独的 GSON 对象,但我试图避免这种情况。
  • @RealSkepitc 我知道所有日期都在同一个时区,所以这并不重要。如果有一种方法我可以同时使用一个字符串并保持时区,那我也可以。
  • 好吧,必须有人了解这两种格式。不是吗?您是否要求一些能够理解这两种格式的现有库或函数?你检查过date4j.net/javadoc/index.html 吗?

标签: java date simpledateformat


【解决方案1】:

最干净和最清晰的解决方案是,如果您可以将两个来源的字符串分开,并为每个来源使用适当的格式化程序。

您可能会考虑的另一种方法是“试一试”以确定您拥有哪种格式并根据该格式选择格式化程序。例如if (result.contains("T") && results.endsWith("Z"))

既然你问过要避免使用不同的格式字符串,那也是可能的:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ ]['T']HH:mm:ss[X]");

    System.out.println(LocalDateTime.parse("2015-11-06 21:23:18", formatter));
    System.out.println(LocalDateTime.parse("2018-08-25T08:18:49Z", formatter));

这个 sn-p 的输出是:

2015-11-06T21:23:18
2018-08-25T08:18:49

我建议您避免使用 SimpleDateFormat 类。它已经过时并且出了名的麻烦。相反,我建议您使用 java.time,这是现代 Java 日期和时间 API。使用起来感觉好多了。

方括号表示格式的可选部分。该格式还将接受一个在中间有空格和T 的字符串,以及一个没有空格的字符串。出于大多数目的,我建议我们可以忍受这一点。编辑:你不能用 SimpleDateFormat 玩类似的把戏,它不接受方括号或任何其他可选部分的语法。

我对忽略第二个字符串中的偏移量并这样做只是因为你说你愿意而感到不高兴。我显然更喜欢以下稍微长一点的解决方案:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ ]['T']HH:mm:ss[X]")
            .withZone(ZoneOffset.UTC);

    System.out.println(OffsetDateTime.parse("2015-11-06 21:23:18", formatter));
    System.out.println(OffsetDateTime.parse("2018-08-25T08:18:49Z", formatter));

输出是一样的,只是现在有偏移:

2015-11-06T21:23:18Z
2018-08-25T08:18:49Z

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

    【解决方案2】:

    我知道这很旧,但是对于中间有 T 的日期和末尾的时区“2018-08-24T08:02:05-04:00”,请在您的 simpledateformat 中使用以下内容:“yyyy- MM-dd\'T\'HH:mm:ssX"

    【讨论】:

    • 问题是当解析日期字符串 SimpleDateFormat 时需要任何未解释的字符——被单引号包围的字符(例如'T')或不在[a-z][A-Z] 中的字符——在解析细绳。如果未解释的字符不存在,它将引发错误。如果我有两种格式,一种带有未解释的字符,另一种没有,我还没有找到一种方法来创建可以同时接受这两种格式的单一格式。
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多