Skip to content

Latest commit

 

History

History
759 lines (452 loc) · 27.1 KB

moyo_clock.md

File metadata and controls

759 lines (452 loc) · 27.1 KB

Module moyo_clock

日付や時間に関する処理を集めたユーティリティモジュール.

Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.

Description

Data Types


datetime() = calendar:datetime()

iso8601datetype() = yyyy | yyyy_mm | yyyy_mm_dd | yyyy_ddd | yyyy_Www_d | yyyymmdd | yyyyWwwd | yyyyddd

iso8601timetype() = hh | hhmm | hhmmss | hh_mm | hh_mm_ss | hh_s | hhmm_s | hh_mm_s | hhmmss_s | hh_mm_ss_s

iso8601zonetype() = z | hh_mm | hhmm | hh

milliseconds() = integer()

non_neg_milliseconds() = non_neg_integer()

non_neg_seconds() = non_neg_integer()

pos_milliseconds() = pos_integer()

pos_seconds() = pos_integer()

seconds() = integer()

timezone() = {Sign::1 | -1, calendar:time()}

timezone_minutes() = integer()

unix_timestamp() = non_neg_seconds()

1970-01-01T00:00:00Z からの経過秒数


unix_timestamp_milliseconds() = non_neg_milliseconds()

1970-01-01T00:00:00Z からの経過ミリ秒

Function Index

datetime_add/2引数の日時に指定秒数を加算する.
datetime_diff/1引数の日時と現在時刻の差を求める.
datetime_diff/2同一タイムゾーンの二つの日時の差を求める.
datetime_diff_tz/2引数のタイムゾーン指定日時と現在時刻の差を求める.
datetime_diff_tz/4タイムゾーン指定の二つの日時の差を求める.
datetime_format/2Equivalent to now_format(Format, datetime_to_now(DateTime)).
datetime_format_tz/4Equivalent to now_format_tz(Format, timezone_minutes(), datetime_to_now(DateTime)).
datetime_to_datetime_tz/3datetime()のタイムゾーンを変更したdatetime()を得る.
datetime_to_iso8601ext/1datetime()型のローカル時刻をISO8601の拡張表記の日付文字列(バイナリ)に変換する.
datetime_to_iso8601ext_tz/2datetime()型の指定タイムゾーン時刻をISO8601の拡張表記の日付文字列(バイナリ)に変換する.
datetime_to_now/1calendar:datetime()形式の日時をerlang:timestamp()形式に変換する.
datetime_to_seconds/1datetime()形式のローカル日時をUNIXタイプスタンプ形式の数値に変換する.
datetime_to_seconds_tz/2datetime()形式の指定タイムゾーン日時をUNIXタイプスタンプ形式の数値に変換する.
is_date/1iso8601もしくはunixtime形式、date()、datetime()、time()であるかを判定する。.
is_date/2Optionsに指定したiso8601形式のどれかであるかを判定する.
is_valid_datetime/1正しい日時になっているかどうかを判定する.
iso8601_to_datetime/1iso8601をdatetime()形式に変換する。.
iso8601_to_datetime_tz/2iso8601を指定タイムゾーンのdatetime()形式に変換する。.
iso8601ext_to_datetime/1ISO8601の拡張表記の日付文字列をローカル時刻のdatetime()型に変換する.
iso8601ext_to_datetime_tz/2ISO8601の拡張表記の日付文字列を指定タイムゾーンのdatetime()型に変換する.
local_timezone_offset_minutes/0ローカル時間のタイムゾーンオフセット[分]を返す。.
milliseconds_to_timestamp/1UNIXタイムスタンプ形式の日時[ミリ秒]をerlang:timestamp()形式に変換する.
now/0現在時刻をerlang:timestamp()形式で返す.
now_format/1Equivalent to now_format(Format, now()).
now_format/2日付/時刻を書式化する.
now_format_tz/2Equivalent to now_format_tz(Format, TzMinutes, now()).
now_format_tz/3
now_milliseconds/0現在時刻をミリ秒形式で取得する。.
now_seconds/0UNIXタイムスタンプ形式の現在時間を取得する.
now_unix_time_in_float/0UNIX Time をfloatで返す.
parse_iso8601/1iso8601形式をパースし, 結果をタプルで返す。.
parse_iso8601_date/1iso8601の日付部分のパースを提供する。.
parse_iso8601_time/1iso8601形式の時刻部分のパースを提供する。.
parse_iso8601_timezone/1タイムゾーンをtime形式に変換する.
seconds_to_datetime/1UNIXタイムスタンプ形式の日時をローカルタイムゾーンのdatetime()形式に変換する.
seconds_to_datetime_tz/2UNIXタイムスタンプ形式の日時を指定タイムゾーンのdatetime()形式に変換する.
seconds_to_now/1UNIXタイムスタンプ形式の日時をerlang:timestamp()形式に変換する.
timestamp_to_milliseconds/1erlang:timestamp() 形式の日時をUNIXタイムスタンプ形式[ミリ秒]に変換する.

Function Details

datetime_add/2


datetime_add(DateTime::datetime(), Seconds::seconds()) -> datetime()

引数の日時に指定秒数を加算する.

datetime_diff/1


datetime_diff(DateTime::datetime()) -> seconds()

引数の日時と現在時刻の差を求める.

Datetime - 現在時刻 = 秒数

datetime_diff/2


datetime_diff(DateTime1::datetime(), DateTime2::datetime()) -> seconds()

同一タイムゾーンの二つの日時の差を求める.

DateTime1 - DateTime2 = 秒数

datetime_diff_tz/2


datetime_diff_tz(DateTime::datetime(), TzMinutes::timezone_minutes()) -> seconds()

引数のタイムゾーン指定日時と現在時刻の差を求める.

Datetime - 現在時刻 = 秒数

datetime_diff_tz/4


datetime_diff_tz(DateTime1::datetime(), TzMinutes1::timezone_minutes(), DateTime2::datetime(), TzMinutes2::timezone_minutes()) -> seconds()

タイムゾーン指定の二つの日時の差を求める.

DateTime1 - DateTime2 = 秒数

datetime_format/2


datetime_format(Format::binary(), DateTime::calendar:datetime()) -> binary()

Equivalent to now_format(Format, datetime_to_now(DateTime)).

datetime_format_tz/4


datetime_format_tz(Format::binary(), TzMinutes::timezone_minutes(), DateTime::calendar:datetime(), TzMinutes2::timezone_minutes()) -> binary()

Equivalent to now_format_tz(Format, timezone_minutes(),datetime_to_now(DateTime)).

datetime_to_datetime_tz/3


datetime_to_datetime_tz(DateTime::datetime(), FromTzMinutes::timezone_minutes(), ToTzMinutes::timezone_minutes()) -> datetime()

datetime()のタイムゾーンを変更したdatetime()を得る.

変換可能な範囲外の日時が渡された場合は、例外が送出される

datetime_to_iso8601ext/1


datetime_to_iso8601ext(DataTime::calendar:datetime()) -> binary()

datetime()型のローカル時刻をISO8601の拡張表記の日付文字列(バイナリ)に変換する

  > datetime_to_iso8601ext({{2014,4,20}, {9,9,9}}).
  <<"2014-04-20T09:09:09+09:00">>

datetime_to_iso8601ext_tz/2


datetime_to_iso8601ext_tz(Value::calendar:datetime(), TzMinutes::timezone_minutes()) -> binary()

datetime()型の指定タイムゾーン時刻をISO8601の拡張表記の日付文字列(バイナリ)に変換する

  > datetime_to_iso8601ext_tz({{2014,4,20}, {9,9,9}}, 540).
  <<"2014-04-20T09:09:09+09:00">>

datetime_to_now/1


datetime_to_now(DateTime::calendar:datetime()) -> erlang:timestamp()

calendar:datetime()形式の日時をerlang:timestamp()形式に変換する.

datetime_to_seconds/1


datetime_to_seconds(DateTime::datetime()) -> unix_timestamp()

datetime()形式のローカル日時をUNIXタイプスタンプ形式の数値に変換する.

変換可能な範囲外の日時が渡された場合は、例外が送出される

datetime_to_seconds_tz/2


datetime_to_seconds_tz(DateTime::datetime(), TzMinutes::timezone_minutes()) -> unix_timestamp()

datetime()形式の指定タイムゾーン日時をUNIXタイプスタンプ形式の数値に変換する.

変換可能な範囲外の日時が渡された場合は、例外が送出される

is_date/1


is_date(Value) -> true | false

iso8601もしくはunixtime形式、date()、datetime()、time()であるかを判定する。

対応するiso8601の形式はparse_iso8601/1に準拠する。

  > is_date(<<"2014-04-01T14-15-16Z">>).
  true.

is_date/2


is_date(Value, Type) -> true | false

Optionsに指定したiso8601形式のどれかであるかを判定する.

iso8601形式のどれであるかを判定した後, Optionsの判定を行う為, 複数のOptionを指定することによってコストはそれほど増えない. また, 日付部分はyyyymmdd時間部分は何でもよいといった指定はできない.

is_valid_datetime/1


is_valid_datetime(Bin::datetime()) -> true | false

正しい日時になっているかどうかを判定する

iso8601_to_datetime/1


iso8601_to_datetime(Bin::binary()) -> datetime()

iso8601をdatetime()形式に変換する。

iso8601のtimezoneがある場合はUTCに変換する。

また、iso8601形式のbinary以外はerror(badarg, [Bin])が投げられる

iso8601_to_datetime_tz/2


iso8601_to_datetime_tz(Bin::binary(), TzMinutes2::timezone_minutes()) -> datetime()

iso8601を指定タイムゾーンのdatetime()形式に変換する。

iso8601のtimezoneがある場合はUTCに変換する。

また、iso8601形式のbinary以外はerror(badarg, [Bin])が投げられる

iso8601ext_to_datetime/1


iso8601ext_to_datetime(Value::binary()) -> calendar:datetime()

ISO8601の拡張表記の日付文字列をローカル時刻のdatetime()型に変換する

なお、現状許容している形式は'YYYY-MM-DDThh:mm:ss(Z|(+|-)hh:mm)'のみで、月や時間等の省略は不可。

不正な文字列が渡された場合は、エラーが送出される.

  > iso8601ext_to_datetime(<<"2014-04-20T09:09:09+09:00">>).
  {{2014,4,20}, {9,9,9}}

iso8601ext_to_datetime_tz/2


iso8601ext_to_datetime_tz(Value::binary(), TzMinutes::timezone_minutes()) -> calendar:datetime()

ISO8601の拡張表記の日付文字列を指定タイムゾーンのdatetime()型に変換する

なお、現状許容している形式は'YYYY-MM-DDThh:mm:ss(Z|(+|-)hh:mm)'のみで、月や時間等の省略は不可。

不正な文字列が渡された場合は、エラーが送出される.

  > iso8601ext_to_datetime(<<"2014-04-20T09:09:09+09:00">>, 0).
  {{2014,4,20}, {0,9,9}}

local_timezone_offset_minutes/0


local_timezone_offset_minutes() -> timezone_minutes()

ローカル時間のタイムゾーンオフセット[分]を返す。

milliseconds_to_timestamp/1


milliseconds_to_timestamp(Milliseconds::unix_timestamp_milliseconds()) -> erlang:timestamp()

UNIXタイムスタンプ形式の日時[ミリ秒]をerlang:timestamp()形式に変換する.

now/0


現在時刻をerlang:timestamp()形式で返す

動作的にはos:timestamp/0と同様.
ユニットテストでモックを行いやすくすることができるのがこの関数の存在意義.

now_format/1


now_format(Format::binary()) -> binary()

Equivalent to now_format(Format, now()).

now_format/2


now_format(Format::binary(), Now::erlang:timestamp()) -> binary()

日付/時刻を書式化する.

以下の文字が format パラメータ文字列として認識されます.
参考: php date関数
http://php.net/manual/ja/function.date.php#refsect1-function.date-parameters

Y年.4桁の数字.
m月.数字.先頭にゼロをつける.
d日.二桁の数字(先頭にゼロが付く場合も)
H時.24時間単位.
i分.先頭にゼロをつける.
s秒.先頭にゼロをつける.
pミリ秒.3桁の数字.先頭にゼロをつける.

ex:

  1> moyo_clock:now_format(<<"Y/m/d-H:i:s(p)">>, now()).
  <<"2013/10/09-11:59:32(131)">>

formatパラメータ文字列にあたる文字をそのまま表示したい場合は, \\ でエスケープできる. ( \\ の後ろの1文字はどの文字でもそのまま表示される. \ も例外ではない.)

ex:

  2> moyo_clock:now_format(<<"\\Year: Y\\\\">>, now()).
  <<"Year: 2013\\">>

now_format_tz/2


now_format_tz(Format::binary(), TzMinutes::timezone_minutes()) -> binary()

Equivalent to now_format_tz(Format, TzMinutes, now()).

now_format_tz/3


now_format_tz(Format::binary(), TzMinutes::timezone_minutes(), Now::erlang:timestamp()) -> binary()

now_milliseconds/0


now_milliseconds() -> unix_timestamp_milliseconds()

現在時刻をミリ秒形式で取得する。

now_seconds/0


now_seconds() -> unix_timestamp()

UNIXタイムスタンプ形式の現在時間を取得する.

now_unix_time_in_float/0


now_unix_time_in_float() -> float()

UNIX Time をfloatで返す

parse_iso8601/1


parse_iso8601(Bin::binary()) -> {ok, {iso8601type(), datetime(), timezone()}} | error

iso8601形式をパースし, 結果をタプルで返す。

正しい時間であることも保証する。

パース可能な書式はiso8601type/0の通り.

20-- (2000年代)などの省略形式 や/を使用した期間表記には対応していない.

返り値Decimal::numberの値域は[0,1) doubleとして表現される 入力に小数点表記がない場合この値は0となる

  > parse_iso8601(<<"2014-04-02T14:15:16Z">>).
  {ok, {{{yyyymmdd, hhmmdd, Z}, {{2014, 4, 2}, {14, 15, 16}}, {1, {0, 0, 0}}}}
  > parse_iso8601(<<"hoge">>).
  error

parse_iso8601_date/1


parse_iso8601_date(Bin::binary()) -> {ok, {iso8601datetype(), calendar:date()}, binary()} | error

iso8601の日付部分のパースを提供する。

入力された時間の正しさも保証する。

  > parse_iso8601_date(<<"2014-W01">>).
  {ok, {yyyy, {2014, 1, 1}}, <<"-W01">>}
  > parse_iso8601_date(<<"2014021234">>).
  {ok, {yyyymmdd, {2014, 2, 12}}, <<"34">>}
  > parse_iso8601_date(<<"20141321">>).
  error

上記のように長く一致する形式として認識する。 ただし、3つ目の例のように、最長一致(2014-13-21)が正常な日付であった場合、 部分一致(2014-132)が正常な日付であってもerrorとして判定する. その為、意図した通りの動作を期待するのであれば、日付の後ろに記述されている文字が0-9であるべきではない. また、入力が日付部分のみであることを期待している場合、下記を用いるべきである.

  > {ok, _, <<>>} = parse_iso8691_date(<<"20140102">>).
  {ok, {yyyymmdd, {2014, 1, 2}}, <<>>}

parse_iso8601_time/1


parse_iso8601_time(Bin::binary()) -> {ok, {iso8601timetype(), calendar:time()}, binary()} | error

iso8601形式の時刻部分のパースを提供する。

時間の正しさも保証される。

日付の変わり目の表現については、24:00:00は許容していない. これは、calendar:time()型で許容されていない為である.

また、小数点表記(hh:mm:ss.sなど)の小数は何桁でも許容されるが、 calendar:time()型で表現できない端数については切り捨てられる.

parse_iso8601_timezone/1


parse_iso8601_timezone(Bin::binary()) -> {ok, {iso8601zonetype(), timezone()}, binary()} | error

タイムゾーンをtime形式に変換する

対応形式は Z, +hh:mm, -hh:mm, +hh, -hh, +hhmm, -hhmm

  > parse_iso8601_timezone(<<"hoge">>).
  error
  > parse_iso8601_timezone(<<"+09:00">>).
  {ok, {hh_mm {1, {9, 0, 0}}}, <<>>}

seconds_to_datetime/1


seconds_to_datetime(Seconds::unix_timestamp()) -> datetime()

UNIXタイムスタンプ形式の日時をローカルタイムゾーンのdatetime()形式に変換する.

seconds_to_datetime_tz/2


seconds_to_datetime_tz(Seconds::unix_timestamp(), TzMinutes::timezone_minutes()) -> datetime()

UNIXタイムスタンプ形式の日時を指定タイムゾーンのdatetime()形式に変換する.

seconds_to_now/1


seconds_to_now(Seconds::unix_timestamp()) -> erlang:timestamp()

UNIXタイムスタンプ形式の日時をerlang:timestamp()形式に変換する.

timestamp_to_milliseconds/1


timestamp_to_milliseconds(X1::erlang:timestamp()) -> unix_timestamp_milliseconds()

erlang:timestamp() 形式の日時をUNIXタイムスタンプ形式[ミリ秒]に変換する.

ミリ秒より細かい精度に関しては切り捨てる.