总所周知,java的时间格式化使用SimpleDateFormat类中的#format和#parse方法,但是这个根据JVM的语言、国家来确定的对格式的解析,例如yyyy MMM dd 对于不同的国家语言是不一样的。
Date date = new Date();
DateFormat sdf = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
System.out.println(sdf.format(date));
输出结果为:2016 十一月 24 14:35:19
API中对 M的解释为:
如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。
由于系统的语言环境是中文,所以这里月份的输出的十一月 。
但是我想输出的月份是Nov怎么办呢?
上文中提到SimpleDateFormat是根据JVM的国家和语言来进行模式解析的,显然 Nov不符合中国的。当然可以通过改变windows系统的国家语言设置,也可以通过代码来实现 ,只需要添加一句话:
Locale.setDefault(Locale.US);
也可以使用SimpleDateFormat的构造方法SimpleDateFormat(String pattern, Locale locale)
修改后的代码:
Date date = new Date();
Locale.setDefault(Locale.US);
DateFormat sdf = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
DateFormat sdf_locale = new SimpleDateFormat("yyyy MMM dd HH:mm:ss",Locale.US);
System.out.println(sdf.format(date));
System.out.println(sdf_locale.format(date));
代码的输出为:2016 Nov 24 14:41:19
使用parse时同理,在new SimpleDateFormat之前设置JVM 的默认语言环境就可以。
可以想到的应用场景:在开发网络爬虫时,遇到国外的网站 大多以 月份的简写或单词 不是以数字的形式,需要把时间换成成距离1970年1月1日的毫秒数(Date#getTime方法),或者转换成自己的时间表达格式。