【问题标题】:Converting Julian date to Java date but still cannot get Month将 Julian 日期转换为 Java 日期,但仍无法获取月份
【发布时间】:2013-05-11 07:25:18
【问题描述】:

我正在尝试从儒略日期获取日、月和年。

    String date = "13136";//Julian date
    Date convertedDate = new SimpleDateFormat("yyDDD").parse(date);
    System.out.println(convertedDate);

打印出来

Thu May 16 00:00:00 BST 2013

这是正确的。

现在我想从中获取 Day 、 Month 和 Year

  Calendar cal = Calendar.getInstance();
  cal.setTime(convertedDate);
  System.out.println(cal.get(Calendar.MONTH));


It prints 4 .

它应该打印 5 而不是 4 。为什么打印不正确?我在这里做错了什么?

【问题讨论】:

    标签: java date format converter julian-date


    【解决方案1】:

    根据Calendar.MONTH的javadoc:

    get 和 set 字段编号,表示月份。这是一个 特定于日历的值。公历一年的第一个月 儒略历是 1 月,即 0;最后取决于 一年中的月数。

    所以几个月从零开始,因此您的输出 4 是正确的,对于代码中的一般用例,将 1 添加到它是安全的,除非您再次将此值用作 Calendar 中的 MONTH 值。

    【讨论】:

    • 这是有道理的。谢谢我的朋友。
    【解决方案2】:

    正如 javadocs 所述,月份从零开始:0 = 一月,1 = 二月,依此类推。

    【讨论】:

      【解决方案3】:

      tl;博士

      LocalDate.parse ( 
          "13136", 
          DateTimeFormatter.ofPattern ( "uuDDD" ) 
      ).getMonthValue()
      

      5

      …2013 年 5 月。

      序数,而不是朱利安

      您对“朱利安”一词的使用在技术上是不正确的,尽管很常见。人们似乎将一年中的某一天(1-365 或 1-366)与计算在某些科学领域中使用的 days elapsed since January 1, 4713 BC 的数量相混淆。

      “ordinal date” 或年份的术语更加清晰。

      ISO 8601

      您的序数日期格式不标准。尽可能使用标准的ISO 8601 formats

      • YYYY-DDD
      • YYYYDDD

      java.time

      现代方法是使用 java.time 类来取代麻烦的旧旧日期时间类。

      DateTimeFormatter

      请注意,DateTimeFormatter 类中的格式化模式代码与旧类相似,但不完全相同。

      String input = "13136";  //Julian date
      DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuDDD" );
      

      LocalDate

      LocalDate 类表示没有时间和时区的仅日期值。

      LocalDate localDate = LocalDate.parse ( input, f );
      

      转储到控制台。

      System.out.println ("localDate: " + localDate );
      

      本地日期:2013-05-16

      Month

      您可以询问LocalDate 的月份。 Month 枚举预定义了十几个对象,一年中的每个月一个。与疯狂的传统课程不同,这些课程在 1 月至 12 月的编号为 1-12。

      如果您在代码中传递月份编号,我建议您改为传递这些枚举对象。这样做可以为您提供类型安全、有效值和自记录代码。

      Month month = localDate.getMonth();
      

      如果需要,您可以获取该月的本地化名称。

      String output = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );  // Or Locale.US, Locale.ITALY, whatever.
      

      如果您确实需要 1-12 月份的数字,请以任一方式询问。

      int monthNumber = month.getValue() ;
      int monthNumber = localDate.getMonthValue() ;
      

      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多