【问题标题】:How to parse out Timestamp from this String?如何从此字符串中解析出时间戳?
【发布时间】:2011-03-19 04:30:45
【问题描述】:

我有这个示例字符串:

Sample string 1:
A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG

Sample string 2:
A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG

所以,我需要从这些字符串中取出时间戳:

2010-07-21T08:52:05.222 or
2010-07-22T07:02:05.370

基本值 b/w d^ and Z

最好(“最聪明”)的方法是什么?子字符串(),正则表达式?

【问题讨论】:

  • 示例看起来像很常见的 ISO8601 格式,它可以帮助您找到“内置”解析器。
  • 请不要使用我的头像好吗?! >_
  • @pavel 大声笑,np,我没有在你的头像上看到“版权”,所以拿走了。 :)
  • 谢谢 :-) 顺便说一句,你的鸭子很酷。

标签: java regex string parsing


【解决方案1】:

我会使用正则表达式,例如(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})

您可能想变得更漂亮,并防止在 01-12 范围之外的月份、在 01-31 范围之外的几天等几个小时,但根据您提供的示例数据,这应该足够好。

如果日期总是以 ^d 为前缀,子字符串可能会起作用,但我仍然认为正则表达式更简洁。

【讨论】:

    【解决方案2】:

    有两个小假设,您可以在没有正则表达式的情况下做到这一点。

    1. 日期字符串前面的^d 是文本中出现的第一个。我假设分隔符总是意味着“日期如下”。
    2. 日期格式看起来很规则,所以我假设长度不会改变。

    只需获取起始^d 分隔符的索引即可找出日期的开始位置并使用长度来获取结束索引。

    public static void main(String[] args) {
        String s1 = "A^1.1#B^1#I^2#f^0#p^1#d^2010-07-21T08:52:05.222ZKHBDGSLKHFBDSLKFGNIF#%$%^$#^$XLGCREWIGMEWCERG";
        String s2 = "A^1.1#B^1#f^0#p^1#d^2010-07-22T07:02:05.370ZREGHCOIMIYR$#^$#^$#^EWMGCOINNNNNNVVVRFGGYVJ667VTG";
    
        System.out.println( parseDate(s1) );
        System.out.println( parseDate(s2) );
    }
    
    public static String parseDate(String s) {
        int start = s.indexOf("d^") + 2;
        int length = 23;
    
        String date = s.substring(start, start + length);
        return date;
    }
    

    输出:

    2010-07-21T08:52:05.222
    2010-07-22T07:02:05.370

    【讨论】:

    • 好的,所以从良好的编程习惯来看,假设字符串的长度不是很糟糕吗?
    • @zengr:我不得不假设,因为我只有 2 个样本可供查看。你不应该假设它,你不应该这样做。您应该能够确定该日期格式是否为固定长度。您接受的正则表达式也采用已知格式。
    • @zengr:不过,我会补充一点,如果您无法验证这两个假设对于任何输入都是正确的,那么您绝对应该坚持使用正则表达式解决方案。
    【解决方案3】:
    Pattern p = Pattern.compile("(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3})");
    //you could also use "d\\^(.*)Z" as your regex patern
    Matcher m = p.matcher("your string here");
    
    if (m.find()) {
        System.out.println(m.group(1)); //print out the timestamp
    }
    

    取自here

    此外,如果您正在循环一系列字符串,请确保重用 Pattern p 对象

    【讨论】:

    • 因为它总是在 "d^" 和 "Z" 之间,做 d\^(.*?)Z 并使用捕获组不是更容易吗?
    • @fy-tide 啊,你是对的。编辑以显示严格和简单的正则表达式模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多