【问题标题】:ZonedDateTime: I would like parse() to fail on invalid dateZonedDateTime:我希望 parse() 在无效日期失败
【发布时间】:2016-08-03 04:11:40
【问题描述】:

我想我只是希望这会给我一个解析异常,但它没有。如果日期无效,我希望解析失败。 (这就是我需要知道的)

添加说明:使用 2 月 30 日作为无效日期:(实际上,我需要做的是接收五个字符串;年、月、日、小时、分钟,我将它们组装成 str(下)和看看它们是否作为一个有效的日期时间组合在一起(ZONE_ID)。

String ZONE_NAME = "America/Los_Angeles";
ZoneId ZONE_ID = ZoneId.of(ZONE_NAME);
String ldtfPattern = "yyyy/MM/dd HH:mm";
DateTimeFormatter localDateTimeFormatter = 
        DateTimeFormatter.ofPattern(ldtfPattern);

String str = "2016/02/30 21:09";

try {
    zdt = ZonedDateTime.parse(str, localDateTimeFormatter().withZone(ZONE_ID));
} catch(DateTimeParseException e) {
    return null;
}
return zdt;

上面解析后zdt的字符串值为 2016-02-29T21:09-08:00[America/Los_Angeles]

【问题讨论】:

  • 您那里的str 与格式匹配,因此不会引发异常。如果你把它改成没有的东西(比如"2016-02-30 21:09"),你确实会得到一个DateTimeParseException
  • @Mureinik 我为此被否决了?现在是 2 月 30 日,这是无效的,我希望它失败。或者我想知道。
  • 哦,好点子! Downvote 已删除,但我建议将其编辑到问题中以突出显示它。
  • @Mureinik,好的。我添加了一个注释段落来澄清我对“无效”的想法。

标签: datetime java-8


【解决方案1】:

一只小鸟告诉我尝试将withResolverStyle() 设置为STRICT。有了这个,我完成这项工作所需的唯一其他技巧就是合并era into my year。所以对上面的改动是:

String ldtfPattern = "uuuu/MM/dd HH:mm";

zdt = ZonedDateTime.parse(str, 
                getLocalDateTimeFormatter().withZone(ZONE_ID).withResolverStyle(ResolverStyle.STRICT));

这对我有用。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多