Vital.DateTime 書いた

前々から、あったらいいなーと思ってたので、vital に DateTime ってモジュールを書いた。名前の通り、日時を扱うライブラリ。
日付の取り扱いは面倒なことは容易に想像できたけど、やはりすごく面倒だった…てかまだあちこち未完成。
とりあえず簡単に使い方を解説。詳細は help 書いてあるんでそちらを。

DateTime オブジェクト

日時を表す。最小単位は秒。
wikipedia:先発グレゴリオ暦を扱います。ユリウス暦? 何それ。

ファクトリ

使い方は関数名と引数から察してください。

  • now([{timezone}])
  • from_unix_time({unix-time} [, {timezone}])
  • from_date([{year} [, {month} [, {day} [, {hour} [, {minute} [, {second} [, {timezone}]]]]]]])
  • from_format({string}, {format} [, {locale}])
  • from_julian_day({jd} [, {timezone}])
メソッド
  • DateTime.year()
  • DateTime.month()
  • DateTime.day()
  • DateTime.hour()
  • DateTime.minute()
  • DateTime.second()
  • DateTime.timezone()
  • DateTime.timezone({timezone})
  • DateTime.day_of_week()
  • DateTime.day_of_year()
  • DateTime.days_from_era()
  • DateTime.julian_day([{float}])
  • DateTime.seconds_of_day()
  • DateTime.quarter()
  • DateTime.unix_time()
  • DateTime.is_leap_year()
  • DateTime.is({DateTime})
  • DateTime.compareTo({DateTime})
  • DateTime.delta({DateTime})
  • DateTime.to({TimeDelta})
  • DateTime.to({TimeZone})
  • DateTime.format({format} [, {locale}])
  • DateTime.strftime({format})
  • DateTime.to_string()

TimeZone オブジェクト

タイムゾーンを表す。今のところオフセット情報のみを持つ。
名前も扱いたいけど、データを全部ぶち込む必要があるし、どうしようか…。

ファクトリ
  • timezone({timezone})
    • 秒数(Number) か "+0900" のような文字列。
    • 名前をサポートすることになったらそれも受け付ける。
メソッド
  • TimeZone.offset()
  • TimeZone.offset_string()
  • TimeZone.offset()
    • 時差を秒単位で返す。
  • TimeZone.minutes()
    • 時差を分単位で返す。
  • TimeZone.hours()
    • 時差を時間単位で返す。
  • TimeZone.sign()
    • 時差の方向を -1, 0, 1 で返す。
  • TimeZone.offset_string()
    • "+0900" みたいな文字列を返す。
  • TimeZone.w3c()
    • "+09:00" みたいな文字列を返す。

TimeDelta オブジェクト

DateTime 同士の差分を表す。

ファクトリ
  • delta()
  • delta({days}, {seconds})
  • delta({value}, {unit}, ...)
    • 値と単位のペア。複数指定可能。
    • 単位は、second, minute, hour, day, week
メソッド
  • TimeDelta.seconds()
  • TimeDelta.minutes()
  • TimeDelta.hours()
  • TimeDelta.days()
  • TimeDelta.weeks()
  • TimeDelta.months()
  • TimeDelta.years()
  • TimeDelta.total_seconds()
  • TimeDelta.sign()
  • TimeDelta.negate()
  • TimeDelta.add({other})
  • TimeDelta.about()
  • TimeDelta.to_string()

その他の関数

  • compare({datetime1}, {datetime2})
  • month_names([{longname} [, {locale}]])
    • 月の名前の配列を返す。
  • weekday_names([{longname} [, {locale}]])*Vital.DateTime.weekday_names()*
    • 週の名前の配列を返す。
  • am_pm_names([{lowercase} [, {locale}]])
    • am/pmの名前の配列を返す。
  • is_leap_year({year})

format について

from_format() と DateTime.format() で使える format について。
基本的に strftime() を参考にしてます。全部は使えないし完璧ではないですが。
%a %A %b %B %d %c %C %D %e %F %H %I %j %k %l %m %n %M %p %P %r %R %s %S %t %u %U %T %w %y %Y %z %%
help に一通り書いてあるので詳細はそちらで。まあほぼ man strftime のコピペですが。注意点として、%c が独自仕様で "%F %T %z" になってる。もっと一般的なW3CDTFとかに変えるかも。



私自身が日付周りにはそこまで詳しくないので、あちこち間違ってる可能性があります。
間違いや要望等があったら Issues やその他私宛てに遠慮なくどうぞ。