UNIX時間の定義は,「協定世界時 (UTC) での1970年1月1日午前0時0分0秒(UNIXエポック)から形式的な経過秒数として表される」 。形式的というのは閏秒の補正を含まないという意味であり,UNIX時間から現行のグレゴリオ暦に換算する際には,1日が60×60×24=86400秒として扱われる。
これを求めるプログラムを,なじみのJulia(2012-)とWolframLanguage(1988-)で書いてみるという課題を自分で考えて練習してみた。Wolfram言語では,1900年1月1日午前0時0分0秒を基準とする絶対時も用いられる。Juliaともども非常に高機能の関数が多数用意されていた。
#! /opt/homebrew/bin/julia
#
using Dates
using DateFormats
using TimeZones
#
# 現在時刻の取得
utime=Int64(round(time()))
println(utime)
#
# 年月日日時分に変換
dt_utc = unix2datetime(utime)
dt_jst = ZonedDateTime(dt_utc, tz"Asia/Tokyo") # JSTに変換
println(Dates.format(dt_jst, "yyyy-mm-dd HH:MM:SS (z)"))
#
# UNIX時間に変換
ut = datetime2unix(DateTime(dt_jst))
println(Int64(ut))
#
# UNIX基準時(JST)
zt_utc = unix2datetime(0)
zt_jst = ZonedDateTime(zt_utc, tz"Asia/Tokyo") # JSTに変換
println(Dates.format(zt_jst, "yyyy-mm-dd HH:MM:SS (z)"))
#
# 2038年問題(JST)
zt_utc = unix2datetime(2^31-1)
zt_jst = ZonedDateTime(zt_utc, tz"Asia/Tokyo") # JSTに変換
println(Dates.format(zt_jst, "yyyy-mm-dd HH:MM:SS (z)"))
#! /usr/local/bin/wolframscript#
#絶対時間の出力
Print[AbsoluteTime[]]
#絶対時間原点の日付
Print[DateString[0]]
#
#現在時刻の取得(msec)
Print[DateString[{"ISODate"," ","Hour",":","Minute",":","Second",".","Millisecond"},TimeZone->"Asia/Tokyo"]]
#
#UNIX時間へ変換(JST)
Print[UnixTime[TimeZone->"Asia/Tokyo"]]
#
#年月日時分秒へ変換(JST)
Print[DateString[TimeZone->"Asia/Tokyo"]]
#
#UNIX基準時(GMT)
Print[UnixTime[FromUnixTime[0,TimeZone->0]]]
Print[DateString[FromUnixTime[0,TimeZone->0]]]
#
#2038年問題(GMT)
Print[UnixTime[FromUnixTime[2^31-1,TimeZone->0]]]
Print[DateString[FromUnixTime[2^31-1,TimeZone->0]]]
UNIX時間は,2038年1月19日に2,147,483,647 = 2^31-1 に達する(今は1,676,850,000あたり)。これが符号付き32ビット整数の最大値なので,これをオーバーフローすればコンピュータの動作が保証できない場合がある。2000年問題より深刻になる可能性があり,2038年問題といわれている。あと15年か。