【问题标题】:Parsing a year String to a LocalDate with Java8使用 Java8 将年份字符串解析为 LocalDate
【发布时间】:2017-05-12 12:02:40
【问题描述】:

有了 Joda 库,你可以做到

DateTimeFormat.forPattern("yyyy").parseLocalDate("2008")

在 2008 年 1 月 1 日创建 LocalDate

用Java8,你可以尝试做

LocalDate.parse("2008",DateTimeFormatter.ofPattern("yyyy"))

但解析失败:

Text '2008' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2008},ISO of type java.time.format.Parsed

有没有其他选择,而不是专门写某事

LocalDate.ofYearDay(Integer.valueOf("2008"), 1)

?

【问题讨论】:

  • 自己写方法?

标签: java-8 jodatime localdate


【解决方案1】:
    String yearStr = "2008";
    Year year = Year.parse(yearStr);
    System.out.println(year);

输出:

2008

如果您需要一种表示年份的方法,那么LocalDate 不是适合您目的的正确类。 java.time 包含一个专门为您服务的 Year 类。请注意,我们甚至不需要显式格式化程序,因为显然您的年份字符串是一年的默认格式。如果稍后您想转换,那也很容易。要转换为一年的第一天,就像 Joda-Time 给你的那样:

    LocalDate date = year.atDay(1);
    System.out.println(date);

2008-01-01

如果您发现以下内容更具可读性,请改用:

    LocalDate date = year.atMonth(Month.JANUARY).atDay(1);

结果是一样的。

如果您从一开始就需要LocalDategreg449’s answer 是正确的,也是您应该使用的。

【讨论】:

    【解决方案2】:

    LocalDate 解析要求指定所有的年、月和日。

    您可以使用DateTimeFormatterBuilderparseDefaulting 方法指定月份和日期的默认值:

    DateTimeFormatter format = new DateTimeFormatterBuilder()
         .appendPattern("yyyy")
         .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
         .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
         .toFormatter();
    
    LocalDate.parse("2008", format);
    

    【讨论】:

      【解决方案3】:

      我没找到你 但从标题我认为你想将一个字符串解析为一个本地日期,所以这就是你的做法

      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
      
      String date = "16/08/2016";
      
      //convert String to LocalDate
      LocalDate localDate = LocalDate.parse(date, formatter);
      

      【讨论】:

      • 我的问题是专门关于解析一年的。我展示了一个使用 Joda 时间的工作示例,但要求以类似的方式使其与 java8 一起工作(没有 joda 时间)。基本上,我在问为什么在 Java8 中将仅一年的字符串解析为 LocalDate 不起作用。
      • 你能把代码贴出来看看为什么它不起作用!
      • 已编辑以显示异常。也许答案只是 Joda 时间在这种情况下是一年中的第一天,但​​是 java8 会抛出异常,因为它缺少创建 LocalDate 的数据。我很好,如果有人可以确认这是预期的行为......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 2015-10-14
      • 2012-11-18
      • 2021-04-16
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多