如何从这个字符串中解析出时间戳?

时间:2010-07-21 19:10:41

标签: java regex string parsing

我有这个示例字符串:

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

最好(“最聪明”)的方法是什么? substring(),regex?

3 个答案:

答案 0 :(得分:4)

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对象

答案 1 :(得分:2)

有两个小假设,你可以在没有正则表达式的情况下完成。

  1. 日期字符串前面的^d是文本中出现的第一个字符串。我认为分隔符总是意味着“日期紧随其后”。
  2. 那个日期格式看起来很规律,所以我假设长度不会改变。
  3. 只需获取起始^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

答案 2 :(得分:0)

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

您可能希望获得更好的体验,并且在01-12之外的时间段内预防数月,在01-31等之外的几个小时,但是它应该足够好,因为您提供的样本数据也是如此。

如果日期始终以^ d为前缀,则子字符串可能有效,但我仍然认为正则表达式更清晰。