Dateish

Object that can be treated as a date

role Dateish { ... }

DateDateTime 都支持访问 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 的类型关系为

img

底层实现代码为:

https://github.com/rakudo/rakudo/blob/master/src/core/Dateish.pm6

Date 

comments powered by Disqus