Perl 6で現在時刻を取得する、ついでにDateTimeの使い方も


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のメソッドも使える.詳細は、こちらを参照.


参考にしたサイト



以下のドキュメンテーションを和(意)訳、改変した.

FloatingActionButtonをスクロール中に消す

NestedScrollView を下にスクロールしている間は, FloatingActionButton を表示させないようにする. 少し変えれば, RecyclerView 等の他のScrollViewにも使えそう(未確認). 下に実際の挙動を示した. 目次 ...