role Dateish { ... }
Date 和 DateTime 都支持访问 year, month 和 day-of-month 以及相关的函数,例如计算星期几。
方法
year 方法
定义为:
method year(Date:D: --> Int:D)
返回日期的月份(1..12)。
say Date.new('2015-12-31').month; # OUTPUT: «12»
say DateTime.new(date => Date.new('2015-12-24'), hour => 1).month; # OUTPUT: «12»
day 方法
定义为:
method day(Date:D: --> Int:D)
返回日期中月份的天(1..31)。
say Date.new('2015-12-31').day; # OUTPUT: «31»
say DateTime.new(date => Date.new('2015-12-24'), hour => 1).day; # OUTPUT: «24»
formatter 方法
定义为:
method formatter(Dateish:D:)
返回用于转换为Str的格式化函数。如果在对象构造时没有提供,则使用默认的格式化程序。在这种情况下,该方法将返回一个 Callable 类型的对象。
格式化函数由 DateTime 方法 Str 以 invocant 作为唯一参数来调用。
my $dt = Date.new('2015-12-31'); # (no formatter specified)
say $dt.formatter.^name; # OUTPUT: «Callable»
my $us-format = sub ($self) { sprintf "%02d/%02d/%04d", .month, .day, .year given $self; };
$dt = Date.new('2015-12-31', formatter => $us-format);
say $dt.formatter.^name; # OUTPUT: «Sub»
say $dt; # OUTPUT: «12/31/2015»
is-leap-year
定义为:
method is-leap-year(--> Bool:D)
如果 Dateish 对象的年份是闰年,则返回 True
。
say DateTime.new(:year<2016>).is-leap-year; # OUTPUT: «True»
say Date.new("1900-01-01").is-leap-year; # OUTPUT: «False»
day-of-month
定义为:
method day-of-month(Date:D: --> Int:D)
返回日期的月份的一天(1..31)。与 day
方法同义。
say Date.new('2015-12-31').day-of-month; # OUTPUT: «31»
say DateTime.new(date => Date.new('2015-12-24'), hour => 1).day-of-month; # OUTPUT: «24»
day-of-week 方法
定义为:
method day-of-week(Date:D: --> Int:D)
返回星期几,其中 1 表示星期一,2 表示星期二,7 表示星期日。
say Date.new('2015-12-31').day-of-week; # OUTPUT: «4»
say DateTime.new(date => Date.new('2015-12-24'), hour => 1).day-of-week; # OUTPUT: «4»
day-of-year
定义为:
method day-of-year(Date:D: --> Int:D)
返回一年中的某一天(1..366)。
say Date.new('2015-12-31').day-of-year; # OUTPUT: «365»
say DateTime.new(date => Date.new('2015-03-24'), hour => 1).day-of-year; # OUTPUT: «83»
days-in-month
定义为:
method days-in-month(Dateish:D: --> Int:D)
返回 Dateish 对象表示的月份中的天数:
say Date.new("2016-01-02").days-in-month; # OUTPUT: «31»
say DateTime.new(:year<10000>, :month<2>).days-in-month; # OUTPUT: «29»
week 方法
定义为:
method week()
返回两个整数的列表:年份和星期编号。这是因为在一年的开始或结束时,本周实际上可能属于另一年。
my ($year, $week) = Date.new("2014-12-31").week;
say $year; # OUTPUT: «2015»
say $week; # OUTPUT: «1»
say Date.new('2015-01-31').week; # OUTPUT: «(2015 5)»
week-number
定义为:
method week-number(Date:D: --> Int:D)
返回调用者指定日期的星期编号(1..53)。一年的第一周由 ISO 定义为包含一月第四天的一周。因此,1月初的日期通常在上一年的最后一周结束,同样,12月的最后几天可能会落在第二年的第一周中。
say Date.new("2014-12-31").week-number; # 1 (first week of 2015)
say Date.new("2016-01-02").week-number; # 53 (last week of 2015)
week-year
定义为:
method week-year(Date:D: --> Int:D)
返回调用者指定日期的星期年份。通常 week-year
等于 Date.year
。但请注意,1月初的日期通常在上一年的最后一周结束,同样,12月的最后几天可能会落在明年的第一周。
say Date.new("2015-11-15").week-year; # 2015
say Date.new("2014-12-31").week-year; # 2015 (date belongs to the first week of 2015)
say Date.new("2016-01-02").week-year; # 2015 (date belongs to the last week of 2015)
weekday-of-month
定义为:
method weekday-of-month(Date:D: --> Int:D)
返回一个数字(1..5),表示在该月份到目前为止发生的特定星期几的次数,该日期包括在内。
say Date.new("2003-06-09").weekday-of-month; # 2 (second Monday of the month)
yyyy-mm-dd 方法
定义为:
method yyyy-mm-dd(Date:D: --> Str:D)
以 YYYY-MM-DD
格式(ISO 8601)返回日期。
say Date.new("2015-11-15").yyyy-mm-dd; # OUTPUT: «2015-11-15»
say DateTime.new(1470853583).yyyy-mm-dd; # OUTPUT: «2016-08-10»
daycount 方法
定义为:
method daycount(Dateish:D: --> Int:D)
返回从 1858 年 11 月 17 纪元日至调用者当天的天数。通过这种方法返回的日数是 MJD,即修正的朱利安日,其通常由天文学家,神学家,科学家和其他人使用。 MJD 公约旨在促进简化的时间顺序计算。
say Date.new('1995-09-27').daycount; # OUTPUT: «49987»
IO 方法
定义为:
method IO(Dateish:D: --> IO::Path:D)
返回表示 Dateish 对象的字符串化值的 IO::Path 对象:
Date.today.IO.say; # OUTPUT: «"2016-10-03".IO»
DateTime.now.IO.say; # OUTPUT: «"2016-10-03T11:14:47.977994-04:00".IO»
可移植性注意:某些操作系统(例如Windows)不允许在文件名中使用冒号( :
),这些冒号会出现在从DateTime 对象创建的 IO::Path
中。
类型图
Dateish 的类型关系为
底层实现代码为:
https://github.com/rakudo/rakudo/blob/master/src/core/Dateish.pm6