Shiika/Timeクラス
論点
monotonicity
「現在時刻を取得するAPI」は、実は経過時間を測るのには不適切
system clockは巻き戻る可能性があるので
タイムゾーン
JSTのようにシンプルなものは、UTCからのオフセット(+09:00)で表せる
夏時間
暦
参考
Rust
Duration, Instant, SystemTimeに分かれている
最効率を求めるRustらしい
std::timeには型くらいしかない
夏時間を扱うにはchrono-tzが必要だが、ずれが固定のタイムゾーンならchrono単体で表現できる (FixedOffset)
以下の4つのメソッドが必須
code:rust
fn offset_from_local_date(
&self,
local: &NaiveDate
) -> LocalResult<Self::Offset>;
fn offset_from_local_datetime(
&self,
local: &NaiveDateTime
) -> LocalResult<Self::Offset>;
fn offset_from_utc_date(&self, utc: &NaiveDate) -> Self::Offset;
fn offset_from_utc_datetime(&self, utc: &NaiveDateTime) -> Self::Offset;
特別な暦には非対応。
PlainTime相当がない(PlainDateとPlainDateTime相当のみ)
Go
一つのオブジェクトにInstant相当とSystemTime相当が両方入っている
効率は下がるが覚えることが少なそう
time.Time
time.Location
C# (.NET)
UTCとの相対
タイムゾーン、の一部(これだけでは夏時間などを表現できない)
まだドラフト
InstantはEpochからの経過時間をもつ
PlainXXはwall-clock timeをもつ
PlainDateTime/PlainDate/PlainTimeの他に、PlainYearMonth/PlainMonthDayがあるのは珍しいかもしれない
あとPlainといえど、Calendar(暦)には紐づいている
暦の情報がないと「1月32日」がvalidか判断できないから?
ZonedDateTimeは両方(+タイムゾーン)をもつ
これらのほかDurationがある
Rails (ActiveSupport)
「現在のシステムタイムゾーン」が取れるか
Rust(chrono,chrono-tz)では取れない?
jsのTemporalではTemporal.Now.timeZone(だっけ)で取れる
new Intl.DateTimeFormat().resolvedOptions().timeZone で取れるので
案
code:sk
class Time # = Instant + Zone
def self.local -> Time
def self.utc -> Time
class Instant
end
class Zone
def self.local
def self.utc -> Zone
end
class Duration
# その他 days, hours, seconds
def minutes -> Float
end
class PlainDateTime
def initialize(@date: PlainDate, @time: PlainTime)
end
class PlainDate
def initialize(@year: Int, @month: Int, @day: Int)
end
class PlainTime
def initialize(@hour: Int, @minutes: Int, @seconds: Int, @nano_frac: Int)
end
PlainXXはTimeで代替することもできるが、「タイムゾーンを含まない日時」であることを明示したときに使うとよさそう
たとえば何かの設定ファイルに"00:06:00"と書いてあるとき、これはPlainTimeで表せる
同様にInstantもutc時刻で代替できるが、それだと意図的なutcとnull代わりのutcを区別できない