Perl6中提供了全面的时间日期对象
Instant
类表示一个时间点,是用数字表示的, 继承Cool类和Real(实数)角色,是数值,相对于Epoch的时间Duration
类表示时间段,从一个时间点到另外一个时间点之间的秒数, 继承Cool类和Real(实数)角色Date
类是日期(年、月、日)DateTime
类是时间,相对Instant
就有时区的描述,(年月日,时分秒)Date
和DateTime
都继承Dateish
PHP,Python,Perl5,javascript用的都是 Unix Epoch
(1970年1月1日,00:00:00 GMT这个时间点),Perl6也是。
Date
的 .daycount
方法和使用 Date.now.Instant/(3600*24)
得到的天数不同。前者是基于Modified Julian Epoch
(MJD,是1858年11月17日,00:00:00 GMT这个时间点),后者是Unix Epoch
,差了一个多世纪。 需要注意,
Instant
类的对象是实数(小数和整数),它的秒数都是基于Unix Epoch
的,不同的语言之间一样;Date
的方法.daycount
是使用MJD
的,Dateish
角色的.new_from_daycount
方法也是,不过也不常用;
PHP中的time()
返回的是现在距离1970年1月1日,00:00:00 GMT
这个时间点的秒数。
到Perl6
#!/usr/bin/perl6my $fmtr = sub ($self) { sprintf "%02d,%02d,%04d-%02d:%02d:%02d", .month, .day, .year, .hour, .minute, .whole-second given $self;}my $d = new DateTime(1467383079,timezone => 3600 * 8, formatter => $fmtr);# 时区:东八区say $d.Str;# gets# 07,01,2016-22:24:39say "Seconds off Unix Epoch:" ~ $d.Instant;say "Days off Unix Epoch:" ~ $d.Instant/(3600*24);say "Days off Julian Epoch:" ~ $d.daycount;# gets# Seconds off Unix Epoch:Instant:1467383115# Days off Unix Epoch:16983.6008680556# Days off Julian Epoch:57570
所以,
#!/usr/bin/perl6my $julian-epoch = Date.new-from-daycount(0);my $unix-epoch = Date.new(year=>1970,month=>1,day=>1);# MJD和Unix Epoch差的天数say "MJD和Unix Epoch差的天数:" ~ $unix-epoch.daycount;# MJD和Unix Epoch差的天数:40587