2023年2月21日火曜日

UNIX時間(1)

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年か。

0 件のコメント: