DateTimeクラスの
nowメソッドを使う.
my $time = DateTime.now;
処理時間を計測する
次のようにすると、任意の処理にかかる時間を計測できる(単位は秒、結果の型は
Durationになる.
詳しくは、infix:<->へ).
my $start = DateTime.now;
...何かの処理...
my $end = DateTime.now;
say $start - $end;
時間を計測するだけなら、
DateTimeは書かなくてもよい(正確には、termの
nowを使っている. この場合は、
両方とも
DateTimeを書か
ない.):
my $start = now;
...何かの処理...
my $end = now;
say $start - $end;
DateTimeの使い方
DateTimeのメソッドと関連する関数を可能な限りまとめてみる.
目次
now メソッド
clone メソッド
hh-mm-ss、hour、minute、second メソッド
whole-second メソッド
timezone、offset メソッド
offset-in-minutes、offset-in-hours メソッド
Instance、Date、DateTime メソッド
posix メソッド
later、earlier メソッド
truncated-to メソッド
utc メソッド
in-timezone メソッド
local メソッド
infix:<-> 関数
infix:<+> 関数
Dateish ロール
now メソッド
定義 :
method now(:$timezone = $*TZ, :&formatter --> DateTime:D)
指定したタイムゾーン、指定した形式の現在時刻を返す.
タイムゾーンは、
GMT(グリニッジ標準時)からのずれを
秒数により指定する.デフォルトでは、
$*TZ変数の値になる.
例 現在時刻を表示する :
say DateTime.now;
実行結果 :
2018-05-26T17:09:47.148866+09:00
clone メソッド
定義 :
method clone(:$year, :$month, :$day, :$hour, :$minute, :$second, :$timezone, :&formatter)
既存のDateTimeオブジェクトで所定の属性を変更した新しいオブジェクトを返す.
例 年を2015年に、月を1月に変える:
say DateTime.new("2018-04-30T17:37:12+09:00").clone(year => 2015, month => 1);
実行結果:
2015-01-30T17:37:12+09:00
hh-mm-ss、hour、minute、second メソッド
定義 :
method hh-mm-ss(DateTime:D: --> Str:D)
method hour(DateTime:D: --> Int:D)
method minute(DateTime:D: --> Int:D)
method second(DateTime:D:)
それぞれ、時:分:秒、時間、分、秒を返す.
例 時:分:秒だけを表示する:
say DateTime.new("2018-04-30T17:37:12+09:00").hh-mm-ss;
実行結果:
17:37:12
whole-second メソッド
定義 :
method whole-second(DateTime:D:)
秒を返すが、その結果はIntに丸め込む(切り下げ).
例 秒数を表示する:
say DateTime.new("2018-04-30T17:37:12.999+09:00").whole-second;
実行結果:
12 #文字が少なすぎて表示されない
timezone、offset メソッド
定義 :
method timezone(DateTime:D: --> Int:D)
method offset(DateTime:D: --> Int:D)
UTC(協定世界時)からのずれを
秒数で取得する.
例 タイムゾーンを表示する:
say DateTime.new("2018-04-30T17:37:12-09:00").timezone;
実行結果:
-32400
offset-in-minutes、offset-in-hours メソッド
定義 :
method offset-in-minutes(DateTime:D: --> Real:D)
method offset-in-hours(DateTime:D: --> Real:D)
UTCからのずれをそれぞれ分、時間で表示する.
Str メソッド
定義 :
method Str(DateTime:D: --> Str:D)
formatter属性によって指定された表現で、時刻を返す.デフォルトでは、
ISO 8601による表記で返す.
例 時刻を表示する:
say DateTime.new("2018-04-30T17:37:12.001+09:00").Str;
実行結果:
2018-04-30T17:37:12.001000+09:00
Instance、Date、DateTime メソッド
定義 :
method Instant(DateTime:D: --> Instant:D)
multi method Date(DateTime:U --> Date:U)
multi method Date(DateTime:D --> Date:D)
method DateTime(--> DateTime)
それぞれ、自身の
Instanceオブジェクト、
Dateオブジェクト、
DateTimeオブジェクトを返す.
posix メソッド
POSIX/UNIXに基づいた時刻、すなわち、1970年1月1日 UTC からの経過秒数を返す.
例 POSIX/UNIXによる時刻を表示する:
say DateTime.new("2018-04-30T17:37:12.001+09:00").posix;
実行結果:
1525077432
later、earlier メソッド
定義 :
method later(DateTime:D: *%unit)
method earlier(DateTime:D: *%unit)
指定した時間だけ遅らせた(later)、または、早めた(earlier)時刻を返す.
引数として有効なキーは以下の通り:
second,
seconds,
minute,
minutes,
hour,
hours,
day,
week,
weeks,
month,
months,
year,
years.
second,
seconds以外を使ったとき以外の値は、Intに変換される.
負の値も指定できる.
例1 1日後の時刻を表示する:
say DateTime.new("2018-04-30T17:37:12.001+09:00").later(:1day);
次でもよい.
say DateTime.new("2018-04-30T17:37:12.001+09:00").later(:day);
実行結果:
2018-05-01T17:37:12.001000+09:00
例2 2年前の時刻を表示する:
say DateTime.new("2018-04-30T17:37:12.001+09:00").earlier(:2years);
次でもよい.
say DateTime.new("2018-04-30T17:37:12.001+09:00").earlier(:2year);
実行結果:
2016-04-30T17:37:12.001000+09:00
truncated-to メソッド
定義 :
method truncated-to(DateTime:D: Cool $unit)
指定場所未満の時刻を切り捨てた時刻を返す(例を見るとわかる).
有効な引数は以下の通り:
'second',
'minute',
'hour',
'day',
'month',
'year'
second,
seconds
例 日以降を切り捨てる:
say DateTime.new("2018-04-30T17:37:12.001+09:00").truncated-to('day');
実行結果:
2018-04-30T00:00:00+09:00
utc メソッド
定義 :
method utc(DateTime:D: --> DateTime:D)
UTCでのオブジェクトの時刻を返す.
例 UTCでの時刻を表示する:
say DateTime.new("2018-04-30T17:37:12.001+09:00").utc;
実行結果:
2018-04-30T08:37:12.001000Z
in-timezone メソッド
定義 :
method in-timezone(DateTime:D: $timezone = 0 --> DateTime:D)
指定したtimezoneにおけるオブジェクトの時刻を返す.引数には、UTCからの
秒数でのずれを指定する.
$timezone = 0とすれば(つまり、デフォルト)、
utcメソッドと同じ値が返される.
例 ロサンゼルス(
太平洋夏時間:UTC-7)における時刻を表示する :
say DateTime.new("2018-04-30T17:37:12.001+09:00").in-timezone(-7 * 60 * 60);
実行結果:
2018-04-30T01:37:12.001000-07:00
local メソッド
定義 :
method local(DateTime:D: --> DateTime:D)
in-timezoneと同じだが、ローカルタイムゾーン(
$*TZ)で指定する.
$*TZは秒数で指定する.
例 ロサンゼルス(太平洋夏時間:UTC-7)における時刻を表示する :
my $*TZ = -7 * 60 * 60; #myは省略可
say DateTime.new("2018-04-30T17:37:12.001+09:00").local;
実行結果:
2018-04-30T01:37:12.001000-07:00
infix:<-> 関数
定義 :
multi sub infix:<-> (DateTime:D, Duration:D --> DateTime:D)
multi sub infix:<-> (DateTime:D, DateTime:D --> Duration:D)
DateTimeオブジェクトと、他の
DateTimeオブジェクトまたは、
Durationオブジェクトとの差を返す.返り値の型は右オペランドによる.すなわち、
DateTime-
Duration=
DateTime
DateTime-
DateTime=
Duration
となる.
例 30日前の時刻を表示する :
say DateTime.new("2018-04-30T17:37:12.001+09:00") - Duration.new(30 * 24 * 60 * 60);
実行結果:
2018-03-31T17:37:12.001000+09:00
infix:<+> 関数
定義 :
multi sub infix:<+> (DateTime:D, Duration:D --> DateTime:D)
multi sub infix:<+> (Duration:D, DateTime:D --> DateTime:D)
DateTimeオブジェクトを、
Durationオブジェクト分だけ進める(順序は問わない).
例 2日後の時刻を表示する :
say DateTime.new("2018-04-30T17:37:12.001+09:00") + Duration.new(2 * 24 * 60 * 60);
実行結果:
2018-05-02T17:37:12.001000+09:00
Dateish ロール
DateTimeは、
Dateishを実装(
Does)しているため、
Dateishのメソッドも使える.詳細は、
こちらを参照.
参考にしたサイト
以下のドキュメンテーションを和(意)訳、改変した.