Java1986-1992的坑

最近項目遇到一個稀奇的事情,有一個用戶的出生日期保存之后回顯就會比保存的值少一天,我們最開始以為是前端解析的問題,后面意識到可能是JSON解析器的問題,先后嘗試了Gson、JackSon、fastJson,Gson默認對時間類型加了TimeZone所以沒有出現上述問題,更加使我認為是JSON的鍋,開始狂看fastJson的issue,搞了好久才發(fā)現是DST的問題,可憐了我的Json解析器

前情概要:

關于DST

夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節(jié)約時制”和“夏令時間”,是一種為節(jié)約能源而人為規(guī)定地方時間的制度,在這一制度實行期間所采用的統(tǒng)一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個采納夏時制的國家具體規(guī)定不同。目前全世界有近110個國家每年要實行夏令時。

DST在中國

1986年4月,中國中央有關部門發(fā)出“在全國范圍內實行夏時制的通知”,具體作法是:每年從四月中旬第一個星期日的凌晨2時整(北京時間),將時鐘撥快一小時,即將表針由2時撥至3時,夏令時開始;到九月中旬第一個星期日的凌晨2時整(北京夏令時),再將時鐘撥回一小時,即將表針由2時撥至1時,夏令時結束。從1986年到1991年的六個年度,除1986年因是實行夏時制的第一年,從5月4日開始到9月14日結束外,其它年份均按規(guī)定的時段施行。在夏令時開始和結束前幾天,新聞媒體均刊登有關部門的通告。1992年起,夏令時暫停實行。

1986年至1991年,每年四月的第2個星期日早上2點,到九月的第2個星期日早上2點之間。

1986年5月4日至9月14日(1986年因是實行夏令時的第一年,從5月4日開始到9月14日結束)

  • 1987年4月12日至9月13日;
  • 1988年4月10日至9月11日;
  • 1989年4月16日至9月17日;
  • 1990年4月15日至9月16日;
  • 1991年4月14日至9月15日。

以上是為啥用戶的出生日期保存之后回顯就會比保存的值少一天的原因,就是因為這個DST導致的,恰恰這個用戶的出生日期在1986-1992這個區(qū)間,才發(fā)現了這個問題,想到在對日期Format的時候加一個TimeZone,統(tǒng)一一個UTC的時區(qū)

jdk1.8以前的處理

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
 simpleDateFormat.format(date);

jdk1.8以后的處理

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Date.from(LocalDateTime.parse(startTimeString,formatter)
    .atZone(ZoneId.systemDefault()).toInstant());
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 我姓付,常有人說,這姓不好,以后做了正職,按常規(guī)叫法,聽起來依然是副職。每每被人介紹,多數人都還要解釋一番。我卻滿...
    飛常心閱讀 664評論 1 3
  • 這是我的第一篇文章,好激動,如果有寫的不好的地方請大家多多包涵,有不對的地方也請指出,謝謝~正常情況下UIText...
    留幾分念想閱讀 2,621評論 0 0
  • 經緊急磋商,玉扳手科技宣布:即日起停止玉扳手旗下“邊走邊學”項目與韓國樂天集團的合作意向。 2月28日,韓國國防部...
    玉扳手閱讀 230評論 0 0
  • 在最近做的項目中,遇到了 Fragment 重疊的問題。在用Fragment做Tab頁面,發(fā)現有時候進入應用會同時...
    Liz_Miller閱讀 7,305評論 4 13

友情鏈接更多精彩內容