2009-12-08 52 views
1

我试图让我的代码尽可能通用。我试图解析产品安装的安装时间。我将在产品中有两个文件,一个具有我需要解析的时间戳记,另一个文件告诉安装的语言。如何用Java或Perl解析Unicode字符的时间戳?

这是我如何解析时间戳

public class ts { 
    public static void main (String[] args){ 
    String installTime = "2009/11/26 \u4e0b\u5348 04:40:54"; 
    //This timestamp I got from the first file. Those unicode charecters are some Chinese charecters...AM/PM I guess 
    //Locale = new Locale();//don't set the language yet 
    SimpleDateFormat df = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT); 
    Date instTime = null; 
    try { 
     instTime = df.parse(installTime); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
     System.out.println(instTime.toString()); 
    } 
} 

我得到的输出是

 
     Parsing Failed 
    java.text.ParseException: Unparseable date: "2009/11/26 \u4e0b\u5348 04:40:54" 
    at java.text.DateFormat.parse(Unknown Source) 
    at ts.main(ts.java:39) 
    Exception in thread "main" java.lang.NullPointerException 
    at ts.main(ts.java:45) 

它抛出异常,并在当我打印它的结束,它显示了一些正确的日期。 ..虽然错了。我真的很感激,如果你能澄清我的这些疑问

  1. 如何解析有Unicode字符,如果这不是正确的方式时间戳?

  2. 如果解析失败,instTime如何能够保存某个日期,但错误? 我知道它的一些中国,韩国时间戳,所以我将语言环境设置为zh和ko,如下所示。即使这样,同样的错误再次出现

    Locale = new Locale(“ko”);

    Locale = new Locale(“ja”);

    Locale = new Locale(“zh”);

我该怎么在Perl中做同样的事情?我不能使用Date :: Manip包;有没有其他方法?

回答

2

你举的例子日期时间戳不conforming to CLDR,所以我们必须手动定义图案。

use utf8; 
use DateTime::Format::CLDR(); 

my $cldr = DateTime::Format::CLDR->new(
    locale => 'zh_CN', 
    pattern => 'yyyy/MM/dd a HH:mm:ss', 
    on_error => 'croak', 
); 

$cldr->parse_datetime('2009/11/26 下午 04:40:54'); # returns a DateTime object 
+0

..谢谢 – Ram 2010-05-14 08:57:40

1

不,U+FFFF is not a valid character在任何平面,所以你的字符串“installTime”包含未定义的垃圾。

编辑:此外,你发布的代码是不是你正在运行的代码,因为你的代码张贴在

java.text.ParseException: Unparseable date: "2009/11/26 ~K~M~H 04:40:54" 
+0

对不起...这是一些复制粘贴错误..!你能帮我解决吗? – Ram 2009-12-08 15:56:43

2

(正确)结果试试这个:

import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 

public class ts { 
public static void main(final String[] args) { 
    String installTime = "2009/11/26 \u4e0b\u5348 04:40:54"; 
    Locale[] locales = DateFormat.getAvailableLocales(); 
    for (Locale locale : locales) { 
     try { 
      Date instTime = DateFormat.getDateInstance(DateFormat.LONG, locale).parse(
        installTime); 
      System.out.println("BINGO! Worked with " + locale); 
      System.out.println(instTime); 
     } catch (Exception ex) { 
     } 
    } 
} 
} 

输出:

BINGO! Worked with ja_JP 
Thu Nov 26 00:00:00 GMT 2009 
BINGO! Worked with ja 
Thu Nov 26 00:00:00 GMT 2009 
+0

谢谢...它的工作原理 – Ram 2009-12-09 04:28:59