Java 1986-1992のピット

1749 ワード

最近、プロジェクトで珍しいことがありました.あるユーザーの生年月日を保存してから、保存した値より1日少ないです.最初はフロントエンドの解析の問題だと思っていましたが、JSON解析器の問題かもしれないことに気づき、Gson、JackSon、fastJsonを試しました.Gsonは時間タイプにTimeZoneをデフォルトで追加したので、上記の問題はありませんでした.さらにJSONの鍋だと思い、fastJsonのissueを見始め、久しぶりにDSTの問題であることに気づき、私のJson解析器をかわいがった.
前情概要:
DSTについて
サマータイム(Daylight Saving Time:DST)は、「日光節約時制」や「サマータイム」とも呼ばれ、省エネのために地方時間を人為的に規定する制度であり、この制度の実施期間中に採用される統一時間を「サマータイム」と呼ぶ.一般的に夜明けの早い夏には時間を1時間速めるため、早起きして早く寝ることができ、照明量を減らし、光の資源を十分に利用し、照明の消費電力を節約することができる.夏時間制を採用する国によって具体的な規定が異なる.現在、世界110カ国近くが毎年サマータイムを実施している.
DSTは中国で
1986年4月、中国中央の関係部門は「全国で夏時間制を実施する通知」を出した.具体的なやり方は、毎年4月中旬の最初の日曜日の午前2時ちょうど(北京時間)から時計を1時間速くし、時計の針を2時から3時にかけ、夏時間から始める.9月中旬の最初の日曜日の午前2時ちょうど(北京の夏時間)、時計を1時間戻して、時計の針を2時から1時にかけて、夏時間は終わります.1986年から1991年までの6年間は、1986年が夏時間制施行の第1年であるため、5月4日から9月14日まで施行されたほか、その他の年は規定の時間帯で施行された.サマータイムの開始と終了の数日前、新聞メディアは関係部門の通告を掲載した.1992年から、サマータイムは実施を一時停止した.
1986年から1991年までは、毎年4月の第2日曜日の朝2時から9月の第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日まで.

  • 以上、ユーザーの生年月日が保存された値より1日少ない理由は、このDSTによるもので、ちょうどこのユーザーの生年月日が1986-1992という区間にあるため、この問題を発見し、日付FormatにTimeZoneを追加し、UTCのタイムゾーンを統一することを考えたからである.
    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());