【问题标题】:Java 8 parse ZonedDateTime from string not containing all fieldsJava 8 从不包含所有字段的字符串中解析 ZonedDateTime
【发布时间】:2017-03-16 05:34:28
【问题描述】:

当我在字符串模式中仅指定年份(可能还有其他几个时间字段)时,我希望将其他不存在的字段设置为它们的最低值。例如,在 Java 8 之前,我的代码看起来像

String source = "2015";
String pattern = "yyyy";
DateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try {
    date = sdf.parse(source);
} catch (ParseException e) {
    e.printStackTrace();
}

SimpleDateFormat sdfGMT2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
sdfGMT2.setTimeZone(TimeZone.getTimeZone("GMT"));

String newf = sdfGMT2.format(date);
System.out.println(newf);

返回给我2015.01.01 00:00:00 GMT

然而,java.time 格式化程序返回一个TemporalAccessor;下面的代码抛出异常

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("YYYY");
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2008", fmt);

例外:

java.time.format.DateTimeParseException:无法解析文本“2008”:无法获取 来自 TemporalAccessor 的 ZonedDateTime:{WeekBasedYear[WeekFields[SUNDAY,1]]=2008},ISO java.time.format.Parsed 类型的

如何使用 Java 8 time API 获得与使用旧 API 相同的结果?

【问题讨论】:

    标签: java time


    【解决方案1】:

    这有点冗长,但您必须在创建 DateTimeFormatter 时指定缺失字段的默认值:

    DateTimeFormatter fmt = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR)
            .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
            .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter()
            .withZone(ZoneOffset.UTC);
    
    ZonedDateTime zonedDateTime = ZonedDateTime.parse("2008", fmt);
    

    这包括ZoneId,这是ZonedDateTime 所必需的。

    【讨论】:

    • 我应该.appendPattern("YYYY")吗?
    • 这就是appendValue() 在上面所做的。但是如果你更愿意使用appendPattern(),你应该使用yyyy而不是YYYY
    • 是的,YYYY 导致异常。谢谢,这有帮助!我将在单独的线程中提出另一个问题,欢迎您帮助我:)
    • 顺便问一下,你知道如何找出月份是否被实际解析(它是否以字符串模式存在)?
    • 很遗憾......似乎这种方法不适用于任意字符串模式(因为我事先不知道模式)。例如,使用.appendPattern("yyyy DDD") 我应该删除.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 2010-10-25
    • 2017-05-19
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多