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