【问题标题】:parsing dates with variable spaces用可变空格解析日期
【发布时间】:2011-08-18 06:48:12
【问题描述】:

我正在使用 Joda 来解析日期并具有不使用前导零的格式,例如:

 Mon Nov 20 14:40:36 2006
 Mon Nov  6 14:40:36 2006

请注意,dayOfMonth 字段左侧填充空白。

目前我似乎必须使用两种不同的格式,如果一个失败则重新解析

"EEE MMM dd HH:mm:ss yyyy"
"EEE MMM  d HH:mm:ss yyyy"

是否有处理这两种情况的单一格式(或 API 切换)? (对于 SimpleDateFormat 的答案是否相同 - 我不使用它?)

【问题讨论】:

  • String = 03-09-2015 06:45:00, s.replaceAll(":(\\s+)",":")

标签: java date jodatime simpledateformat


【解决方案1】:

我刚刚创建了一个快速程序来检查这个 -

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy");

try {
    String source1 = "Mon Nov 20 14:40:36 2006";
    Date d1 = sdf.parse(source1);
    String source2 = "Mon Nov  6 14:40:36 2006";
    Date d2 = sdf.parse(source2);

    String res1 = sdf.format(d1);
    String res2 = sdf.format(d2);

    System.out.println(source1 +"="+ res1);
    System.out.println(source2 +"="+ res2);
} catch (ParseException e) {
    e.printStackTrace();
}

这个的输出是 -

Mon Nov 20 14:40:36 2006=Mon Nov 20 14:40:36 2006
Mon Nov  6 14:40:36 2006=Mon Nov 6 14:40:36 2006

所以,即使 source2 有多余的空间,它仍然被

解析
EEE MMM d HH:mm:ss yyyy

希望有帮助

【讨论】:

  • 非常感谢 - SimpleDateFormat 和 Joda 之间可能存在差异
【解决方案2】:

我尝试在 logstash 1.1.1 中使用上面建议的单个“d”,但是当解析带有额外前导空格的单个数字天时,它仍然抱怨日期格式错误。以下 logstash 规则确实有效。

timestamp => [ "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]

这两种日期格式的顺序无关紧要。添加两种格式后,不再输出警告。

【讨论】:

    【解决方案3】:

    java.time 和格式模式字母 p

    这是现代答案,使用的是 Joda-Time 的继承者 java.time。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM ppd HH:mm:ss uuuu", Locale.ENGLISH);
    
        String[] stringsToParse = {
                "Mon Nov 20 14:40:36 2006",
                "Mon Nov  6 14:40:36 2006"
        };
        for (String dateTimeString : stringsToParse) {
            LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
            System.out.println(dateTime);
        }
    

    输出:

    2006-11-20T14:40:36
    2006-11-06T14:40:36
    

    DateTimeFormatter.ofPattern 格式字母p 表示左边用空格填充。 pp 表示填充到两个位置。它既可用于格式化,也可用于解析。

    我知道你问过 Joda-Time。 Joda-Time 主页说:

    请注意,Joda-Time 被认为是一个基本上“已完成”的项目。 没有计划进行重大改进。如果使用 Java SE 8,请迁移 到java.time (JSR-310)。

    链接

    【讨论】:

    • 非常感谢。我不知道java.time。将尝试转换
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2021-11-10
    • 2016-03-23
    • 2012-07-15
    • 2020-11-16
    • 2014-03-02
    • 2018-08-06
    相关资源
    最近更新 更多