轉:http://blog.csdn.net/liao_leo/article/details/44593095
今天遇到個很奇怪的問題,gson解析日期字符串,本地執行可以,服務器上執行就報錯。
這種問題一般都跟環境相關,到gson源代碼中看到了DateTypeDapter這個類,
private final DateFormat enUsFormat
= DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.US);
private final DateFormat localFormat
= DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);
private final DateFormat iso8601Format = buildIso8601Format();
private static DateFormat buildIso8601Format() {
DateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC"));
return iso8601Format;
}
它有幾種parse日期字符串的的DataFormat類,一個個嘗試,如果不成功就報錯。
2015-03-24 14:54:14我們的日期格式是這樣,本地轉沒問題,服務器上轉就報錯。localFormat 和enUsFormat跟本地語言有關,它的一些格式化類都在這個localdata.jar里面,java會獲取本機的語言,然后加載不同的類獲取格式 化信息。我本地的是zh_CN,服務器上的是en_US,本地是能夠轉換2015-03-24 14:54:14這個,因為它的格式正好是yyyy-MM-dd這種,但是服務器上的Dataformat的partern是en_us,無法解析 2015-03-24 14:54:14,就報錯了。
解決辦法,修改linux的
1.修改/etc/sysconfig/i18n
英文版系統:
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
中文版系統:
LANG="zh_CN.UTF-8"
SYSFONT="latarcyrheb-sun16"
2.source /etc/sysconfig/i18n
3.重啟服務