【问题标题】:How to convert Julian to Date in Java for format of "yyDHH"如何在 Java 中将 Julian 转换为日期格式为“yyDHH”
【发布时间】:2015-05-25 13:29:49
【问题描述】:

yy = 15(年),D = 150(一年中的一天),HH = 10(小时)

 Date myDateWrong = new SimpleDateFormat("yyDHH").parse("1515010");
 Date myDateTrue = new SimpleDateFormat("yyD").parse("15150");

myDateTrue 是正确的:2015 年 5 月 30 日。 myDateWrong 必须是 30/05/2015 10:00:00,但似乎是 28/07/2015 18:00:00。这里有什么问题?

【问题讨论】:

  • 我没有使用 Java 中的常规 Date 类,所以我无法帮助你。但我一直使用Joda-Time library,它确实支持Julian calendar。因此,如果本机 Java 库不适合您,您可以考虑使用它。
  • 首先你应该避免使用 java Date 作为儒略历。 Java Date API 被破坏了,尤其是在涉及复杂的时间处理和计算时,例如使用不同的日历。 Java 8 有一个新的时间 API 可以解决这些问题,其中 Date 已被 LocalDateTime 取代。儒略历是由公历在 Java 8 中实现的。 docs.oracle.com/javase/8/docs/api/java/util/…
  • 你能解释一下你对“朱利安”这个词的理解吗? (儒略历或儒略日数)有几种完全不同的含义。
  • @Pierre 我觉得你的评论很奇怪。首先,您抱怨旧的 Java 对日期和时间的支持。然后你推荐使用 Java-8 和新的java.time-package。最后你回到推荐java.util.GregorianCalendar的旧Java-stuff,它与Java-8中引入的新时间库无关。我觉得很混乱。顺便说一句:java.util.Date 的新替代品是 java.time.Instant

标签: java date simpledateformat julian-date


【解决方案1】:

我猜 wrongDate 取了一个数字的月份(如您所指定的),然后取了其余的数字(就像它取了儒略日期的其余数字一样)原始格式)。所以你得到了 2015 年、1 月和 5010 小时。我没有详细计算过,但 5010 小时将给您大约 7 个月的时间,这可以解释在 7 月结束。 18:00 仅反映剩余的时间。

因此,您需要使用 DDD 作为儒略日的说明符(而不是另一条评论中建议的 ddd),然后它会按预期出现。

【讨论】:

    【解决方案2】:

    您的格式不正确。你应该使用:

    Date myDateWrong = new SimpleDateFormat("yydddhh").parse("1515010");
    

    【讨论】:

      【解决方案3】:

      你需要 15150 成为 30/05/2015... 但实际上是 12:00:00 试试 this:

      String j = "15150";
      Date date = new SimpleDateFormat("yyD").parse(j);
      String g = new SimpleDateFormat("dd.MM.yyyy hh:mm").format(date);
      System.out.println(g);
      

      【讨论】:

        【解决方案4】:

        tl;博士

        LocalDateTime ldt = LocalDateTime.parse ( "1515010" , DateTimeFormatter.ofPattern ( "yyDHH" ) );
        LocalDate ld = LocalDate.parse ( "15150" , DateTimeFormatter.ofPattern ( "yyD" ) );
        

        不是朱利安…序数日期

        使用术语“朱利安”来表示一年中的有序数字在技术上并不正确,但仍然普遍使用。我建议您避免与实际的Julian date 混淆和混淆,并坚持使用准确的术语ordinal date 或“一年中的一天”。

        java.time

        Java 8 及更高版本中内置的java.time 框架可以在这里提供帮助。下面的示例代码证明了您的两种方案(有和没有时间)在 java.time 中都能正常工作。

        这些 java.time 类取代了旧的麻烦的日期时间类,例如 java.util.Date。见Oracle Tutorial。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

        使用DateTimeFormatter 类定义格式化程序模式。格式化代码和SimpleDateFormat的类似,但不完全相同,所以研究类文档。对于此类,如果省略世纪,则假定为 21 世纪 (20xx)。

        String input = "1515010";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyDHH" );
        
        LocalDateTime ldt = LocalDateTime.parse ( input , formatter );
        

        LocalDateTime 缺少任何时区或与 UTC 的偏移信息。所以它确实代表时间轴上的一个时刻。如果我们可以假设此输入是在 UTC 时区的上下文中,则转换为 OffsetDateTime

        OffsetDateTime odt = ldt.atOffset ( ZoneOffset.UTC );
        

        转储到控制台。

        System.out.println ( "input: " + input + " | ldt: " + ldt + " | odt: " + odt );
        

        输入:1515010 |日期:2015-05-30T10:00 | odt: 2015-05-30T10:00Z

        对于没有时间和时区的仅日期值,我们实例化 LocalDate

        String input = "15150";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyD" );
        LocalDate ld = LocalDate.parse ( input , formatter );
        

        转储到控制台。

        System.out.println ( "input: " + input + " | ld: " + ld );
        

        输入:15150 | ld: 2015-05-30

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-23
          • 2013-09-14
          • 2013-05-11
          相关资源
          最近更新 更多