我们通常都很喜欢用SimpleDateFormat来做一些日期和字符串之间的转换,就是所谓的format()和parse()了,具体用法看程序或者是JAVA的API文档,这里不累述了。
但是往往我们忘记了,JAVA的国际化这个让人欢喜让人愁的东西。
下面出现一个问题:
以下程序段
String dateStr = “17/Mar/2003 11:30:51”;
SimpleDateFormat frm = new SimpleDateFormat(“dd/MMM/yyyy HH:mm:ss”);
Date date = frm.parse(dateStr);
SimpleDateFormat frm1 = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”);
System.out.println(“reformat : “ + frm1.format(date));
这运行时会抛出异常java.text.ParseException: Unparseable date: “17/Mar/2003 11:30:51″,显然程序不能parse到“Mar”这个英文月的缩写。但是按照java上面的文档显示,以上程序是没有问题的。一个典型的运行时异常。不用说考虑一下我们的环境。
当前程序编写的环境是中文winxp,jdk1.4.2,IDEA 4.0,呵呵,我们是中国人当然都喜欢用中文环境啦。问题出来了吧?看一下一段代码:
Date date = new Date();
SimpleDateFormat frm1 = new SimpleDateFormat(“yyyy/MMM/dd HH:mm:ss”);
System.out.println(“now : “ + frm1.format(date));
输出结果是:now : 2004/二月/24 11:57:00
看到了,缺省状态底下,我们用SimpleDateFormat是按照我们当前系统的Locale(请恕我一直都搞不清楚他的中文翻译)的,也就是中文的Locale,但是我们要进行分析的日期字符串是英文的,当然就认不出来了。
ok,知道了之后,我们修改一下加多个locale进去,让SimpleDateFormat在构造的时候指定Locale(Java是很笨的,我们不说他怎么知道呢?)告诉他我们现在要处理的是英文的格式串
Locale locale = Locale.US;
String dateStr = “17/Mar/2003 11:30:51”;
SimpleDateFormat frm = new SimpleDateFormat(“dd/MMM/yyyy HH:mm:ss”, locale);
Date date = frm.parse(dateStr);
SimpleDateFormat frm1 = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”, locale);
System.out.println(“reformat : “ + frm1.format(date));
程序正常了……
问题主要就是出在我们在不同环境底下对一些国际化处理上面的不小心或者容易忽略的地方,仅当作教训供大家一笑。
哇, 你做技术网站啊!!