如何从此字符串解析出时间戳?

问题描述:

我有这样的样本串:如何从此字符串解析出时间戳?

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(),正则表达式?

+0

这些例子看起来很像ISO8601格式,这可能会帮助您找到一个“内置”解析器。 – Freiheit 2010-07-21 19:29:07

+0

你能不能使用我的头像? > _ 2010-07-21 20:03:01

+0

@pavel lol,np,我没有看到你的头像上有一个“版权”,所以拿了它。 :) – zengr 2010-07-21 21:44:20

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对象,如果你通过一系列串

+0

因为它总是在“d ^”和“Z”之间,所以只用d ^(。*?)Z和使用捕获组是不是更容易? – NorthGuard 2010-07-21 19:29:02

+0

“d \\ ^(。*?)Z”也有效 – zengr 2010-07-21 19:36:44

+0

@ fy-tide啊,你说的没错。编辑显示严格和简单的正则表达式模式。 – sigint 2010-07-21 19:41:03

两个小假设你可以不用正则表达式的循环。

  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

+0

好的,所以从良好的编程习惯,是不是假设一个字符串的长度不好? – zengr 2010-07-21 19:54:05

+1

@zengr:我必须假设它,因为我只有2个样本可供查看。你不应该假设它,你不应该。您应该能够找出该日期格式是否为固定长度。您接受的正则表达式也采用已知的格式。 – 2010-07-21 19:59:13

+0

@zengr:我会补充一点,如果你无法验证这两个假设对于任何输入都是真的,你应该坚持使用正则表达式的解决方案。 – 2010-07-21 20:05:00

我会去与一个正则表达式,喜欢的事(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\.\d{3})

您可能希望获得更好的发现,并防止01-31之外的几个月,01-31之外的时间等几个小时,但它应该足够好,就像您提供的样本数据一样。

如果日期总是以^ d为前缀,子串可能会工作,但我仍然认为正则表达式更清晰。