最近話題のサマータイム、なんと過去に1度導入されたことがあるとか。
日本において夏時間は、第二次世界大戦敗北後の連合国軍占領期にGHQ指導下で公的に導入され、1948年(昭和23年)4月28日に公布された夏時刻法に基づき、同年5月2日の午前0時から9月11日にかけて初めて実施された。
以後、毎年5月(ただし、1949年(昭和24年)のみ4月)第1土曜日24時(= 日曜日0時)から9月第2土曜日25時(= 日曜日0時)までの間に夏時間が実施されることとなったが、残業増加や寝不足を引き起こすなどとして不評を呼び、1951年(昭和26年)度はサンフランシスコ講和条約が締結された第2金曜日の9月7日で打ち切られ、翌1952年(昭和27年)4月27日の占領終了と同月28日の条約発効による日本の主権回復に先立ち、夏時刻法は同年4月11日に廃止された。
なお、当時の人々やマスコミはサマータイムではなくサンマータイムと呼んだ。
じゃあ該当する年のタイムスタンプってどういう扱いなんだろうか
実際にやってみた(CV:中江真司)
タイムスタンプ -> Date
let df = DateFormatter()
df.timeStyle = .full
df.dateStyle = .full
df.locale = Locale(identifier: "ja_JP")
func printDate(timeStamp: TimeInterval) {
print(df.string(from: Date(timeIntervalSince1970: timeStamp)))
}
print("~~~~~~ 1947年 サマータイム導入前 ~~~~~~")
printDate(timeStamp: -715424401) // -> 1947年5月1日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -715424400) // -> 1947年5月2日 金曜日 0時00分00秒 GMT+09:00
print("~~~~~~ 1948年 サマータイム開始 ~~~~~~")
printDate(timeStamp: -683802001) // -> 1948年5月1日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -683802000) // -> 1948年5月2日 日曜日 1時00分00秒 GMT+10:00
printDate(timeStamp: -672314401) // -> 1948年9月11日 土曜日 23時59分59秒 GMT+10:00
printDate(timeStamp: -672314400) // -> 1948年9月11日 土曜日 23時00分00秒 GMT+09:00
print("~~~~~~ 1949年 ~~~~~~")
printDate(timeStamp: -654771601) // -> 1949年4月2日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -654771600) // -> 1949年4月3日 日曜日 1時00分00秒 GMT+10:00
printDate(timeStamp: -640864801) // -> 1949年9月10日 土曜日 23時59分59秒 GMT+10:00
printDate(timeStamp: -640864800) // -> 1949年9月10日 土曜日 23時00分00秒 GMT+09:00
print("~~~~~~ 1950年 ~~~~~~")
printDate(timeStamp: -620298001) // -> 1950年5月6日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -620298000) // -> 1950年5月7日 日曜日 1時00分00秒 GMT+10:00
printDate(timeStamp: -609415201) // -> 1950年9月9日 土曜日 23時59分59秒 GMT+10:00
printDate(timeStamp: -609415200) // -> 1950年9月9日 土曜日 23時00分00秒 GMT+09:00
print("~~~~~~ 1951年 サマータイム終了 ~~~~~~")
printDate(timeStamp: -588848401) // -> 1951年5月5日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -588848400) // -> 1951年5月6日 日曜日 1時00分00秒 GMT+10:00
printDate(timeStamp: -577965601) // -> 1951年9月8日 土曜日 23時59分59秒 GMT+10:00
printDate(timeStamp: -577965600) // -> 1951年9月8日 土曜日 23時00分00秒 GMT+09:00
print("~~~~~~ 1952年 ~~~~~~")
printDate(timeStamp: -557398801) // -> 1952年5月3日 土曜日 23時59分59秒 GMT+09:00
printDate(timeStamp: -557398800) // -> 1952年5月4日 日曜日 0時00分00秒 GMT+09:00
String -> Date
let df = DateFormatter()
df.timeZone = TimeZone(identifier: "Asia/Tokyo")
df.locale = Locale(identifier: "ja_JP")
df.dateFormat = "yyyy/MM/dd HH:mm:ss"
print(df.date(from: "1948/5/1 23:59:59")) // -> "Optional(1948-05-01 14:59:59 +0000)"
print(df.date(from: "1948/5/2 00:00:00")) // -> nil
print(df.date(from: "1948/5/2 01:00:00")) // -> "Optional(1948-05-01 15:00:00 +0000)"
df.timeZone = TimeZone(secondsFromGMT: 9 * 60 * 60)
df.locale = Locale(identifier: "ja_JP")
df.dateFormat = "yyyy/MM/dd HH:mm:ss"
print(df.date(from: "1948/5/1 23:59:59")) // -> Optional(1948-05-01 14:59:59 +0000)
print(df.date(from: "1948/5/1 23:59:59")?.timeIntervalSince1970) // -> Optional(-683802001.0)
print(df.date(from: "1948/5/2 00:00:00")) // -> Optional(1948-05-01 15:00:00 +0000)
print(df.date(from: "1948/5/2 00:00:00")?.timeIntervalSince1970) // -> Optional(-683802000.0)
print(df.date(from: "1948/5/2 01:00:00")) // -> Optional(1948-05-01 15:00:00 +0000)
print(df.date(from: "1948/5/2 01:00:00")?.timeIntervalSince1970) // -> Optional(-683802000.0)
時刻の変わり目でしれっと GMT+09:00
-> GMT+10:00
に変わってたり
1948年5月2日の0時台がちゃんと存在しないことになってたり
しっかりと歴史を踏まえた実装になっていることが分かります(正直無視されててもおかしくないと思ってた)。
面白いのがGMT+09:00
だと1948/5/2 00:00:00
が存在していることですね。
つまり、TimeZone(identifier: "Asia/Tokyo")
にした時だけ1948/5/2 00:00:00
が存在しなくなるということです。
ちなみに
試しにターミナルで同じことを試してみましたが、
$ date -r -683802001
1948年 5月 1日 土曜日 23時59分59秒 JST
$ date -r -683802000
1948年 5月 2日 日曜日 01時00分00秒 JDT
とSwiftで書いた場合と同じ結果が返ってきています
この事から、過去に日本で実施されたサマータイムはOSレベルでサポートされていると予測できます。
(おそらく他のLinux系OSも同じだと考えられます。MS系は知らん←)
結論
日本国内のシステムにばかり話が行きがちですが、海外のシステムも日本からアクセスされることを考えると、
OS内部のタイムゾーン周りの処理に手を入れる必要があるはずです。
つまり、IT視点で見ると今の日本でサマータイムを導入するということは日本国内だけでなく世界のIT企業を巻き込むということになるのではなかろうか。
それでもサマータイムやりますか?