【问题标题】:How to Validate Ordinal Dates?如何验证序数日期?
【发布时间】:2021-01-19 12:42:31
【问题描述】:

我的朱利安日期是 7 位数字格式 YYYYDDD。 我想确保应该涵盖闰年的所有情况。目前我已经检查了几天。是否有任何实用程序验证它?

【问题讨论】:

  • @BasilBourque 公平地说,这些答案没有提及如何验证日期。
  • @FedericoklezCulloca 点。我重新打开了问题。感谢您指出我的错误。我也会在这里提供答案。
  • 儒略日期已过时。只需检查 YY 的最后 2 位数字是否为 4 的倍数。但我们传递给公历的是几个世纪(在世界大部分地区)。
  • @GiacomoCatenazzi 这个问题问的是ordinal dates,而不是Julian calendar。 “朱利安日期”是“序数日期”的常见误称。误称可能来自对天文学中使用的 Julian day 计数的误解。

标签: java spring date


【解决方案1】:

序号日期

“Julian”是用年份表示的日期的误称。 Ordinal date 是一个更好的名字。

用词不当会引起混淆,因为序号日期与Julian calendar 无关。用词不当很可能来自对天文学中使用的Julian day 计数的误解。

DateTimeFormatter

使用自定义格式定义 DateTimeFormatter。在您的自定义格式模式中,使用三个大写字母 D,DDD,作为年份数字。

尝试解析您的字符串输入。陷阱DateTimeParseException

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuDDD" ) ;
try
{
    LocalDate ld = LocalDate.parse( input ) ;
} 
catch ( DateTimeParseException e )
{
    // handle faulty input
}

ISO 8601

我建议您对数据的发布者进行有关ISO 8601 格式的教育。序号日期的标准格式是 8 个字符,在年份和年份数字之间使用连字符。 DateTimeFormatter 类将该格式定义为常量:ISO_ORDINAL_DATE。我强烈建议您在将日期时间值交换为文本时坚持使用 ISO 8601 格式。

如需更多解释,请参阅my detailed Answer on similar Question。

【讨论】:

    【解决方案2】:

    我想确保涵盖闰年的所有情况。 目前我已经检查了几天。是否有任何实用程序验证 吗?

    是的,只需使用 uuuuDDD 模式将字符串格式化为 LocalDate,解析 API 将自动考虑闰年。

    演示:

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    
    public class Main {
        public static void main(String[] args) {
            // The 100th day of the year, 2020
            String strDate1 = "2020100";
    
            // The 100th day of the year, 2019
            String strDate2 = "2019100";
    
            // Notice 'D' (day-of-year) instead of 'd' (day-of-month)
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuDDD");
    
            LocalDate date1 = LocalDate.parse(strDate1, dtf);
            LocalDate date2 = LocalDate.parse(strDate2, dtf);
    
            System.out.println(date1);
            System.out.println(date2);
        }
    }
    

    输出:

    2020-04-09
    2019-04-10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-31
      • 2011-12-20
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多