本地與服務器執行結果不同的一種情況——格式化日期未設定區域
在德不在鼎。… 德之休明,雖小,重也;其奸回昏亂,雖大,輕也。… 鼎之輕重,未可問也。
起源:本地100,線上200
最近生產環境除了一個奇怪的事情:我司程序員張三在其本地調試運行某個功能模塊的代碼后,上線運行通過,但是發現其執行結果與預期不符合,而且,最最詭異的事情是,在其本地執行與預期結果是相符合的。
簡單來說,一段程序在張三的電腦上運行,執行結果為100。將同樣的一段代碼放在服務器上執行,執行結果就變成200了。
定位:打log
為了找到問題,我們在代碼各個IF判斷位置插入日志,重新部署在服務器上執行,然后根據日志判斷其程序走向與定位問題。
結果
最終,我們定位到這樣一個方法:
/** * 星期幾 * @param date * @return 星期幾 */ public static String getChineseWeek(Date date) { SimpleDateFormat EEEE = new SimpleDateFormat("EEEE"); return EEEE.format(date); }
首先我們在本地運行一下這段代碼,編寫測試用例:
@Test public void testSimpleDateFormate() { SimpleDateFormat EEEE = new SimpleDateFormat("EEEE"); System.out.println(EEEE.format(new Date())); }
執行結果如下:
星期四
但是我們在服務器中,同樣的代碼,執行結果卻不同,如下所示:
[INFO]-[Thread: catalina-exec-7699]-[com.jfinal.kit.LogKit.info()]: Thursday
經過查詢發現,原來SimpleDateFormat是和其運行環境有關的。其完整文檔如下:
public SimpleDateFormat(String pattern)
使用給定模式SimpleDateFormat并使用默認的FORMAT語言環境的默認日期格式符號。 **注意:**此構造函數可能不支持所有區域設置。 要全面覆蓋,請使用DateFormat類中的工廠方法。
這相當于調用SimpleDateFormat(pattern, Locale.getDefault(Locale.Category.FORMAT)) 。
參數
pattern - 描述日期和時間格式的模式
異常
NullPointerException - 如果給定的模式為空
IllegalArgumentException - 如果給定的模式無效
另請參見:
Locale.getDefault(java.util.Locale.Category) , Locale.Category.FORMAT
我們通常使用的格式:yyyy-MM-dd不論在中文環境下還是英文環境下輸出都是一樣的,而遇到星期這種表達,中文與英文出現了分期,那么,如何才能避免這種的表達形式的,那就是指明所使用的語言。
如下所示:
/** * 星期幾 * @param date * @return 星期幾 */ public static String getChineseWeek(Date date) { SimpleDateFormat EEEE = new SimpleDateFormat("EEEE", Locale.CHINESE); return EEEE.format(date); }
如此便不會出現因為服務器區域設定不同而造成的格式不達預期的問題。
設定區域方法的完整官方文檔如下:
public SimpleDateFormat(String pattern, Locale locale)
構造一個SimpleDateFormat使用給定的模式和給定的區域設置的默認日期格式符號。 **注意:**此構造函數可能不支持所有區域設置。 為了全面覆蓋,請使用DateFormat類中的工廠方法。
參數
pattern - 描述日期和時間格式的模式
locale - 應使用日期格式符號的區域設置
異常
NullPointerException - 如果給定的模式或區域設置為空
IllegalArgumentException - 如果給定的模式無效
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。