Author: Kodi Date: 2010-07-08 01:42:53 +0200 (Thu, 08 Jul 2010) New Revision: 31571
Modified: docs/Perl6/Spec/S32-setting-library/Temporal.pod t/spec/S32-temporal/DateTime.t Log: [S32] Dropped mention of quarters from Temporal.pod. I don't think quarter-numbering belongs in the core, since (as far as I know) there is no precise standard way of dividing calendar years into four. Modified: docs/Perl6/Spec/S32-setting-library/Temporal.pod =================================================================== --- docs/Perl6/Spec/S32-setting-library/Temporal.pod 2010-07-07 22:19:08 UTC (rev 31570) +++ docs/Perl6/Spec/S32-setting-library/Temporal.pod 2010-07-07 23:42:53 UTC (rev 31571) @@ -128,9 +128,6 @@ month, the day itself included. For example, June 9, 2003 is the second Monday of the month, and so this method returns 2 for that day. -The C<quarter> method returns the quarter of the year, a value between 1 -and 4. The C<day-of-quarter> method returns the day of the quarter. - The C<day-of-year> method returns the day of the year, a value between 1 and 366. Modified: t/spec/S32-temporal/DateTime.t =================================================================== --- t/spec/S32-temporal/DateTime.t 2010-07-07 22:19:08 UTC (rev 31570) +++ t/spec/S32-temporal/DateTime.t 2010-07-07 23:42:53 UTC (rev 31571) @@ -1,8 +1,10 @@ use v6; use Test; +use Temporal; use Date; # XXX + plan *; - +#`⁅ my ( DateTime $g1, DateTime $g2, Num $t, Int $d ); $g1 = DateTime.from-epoch(0); @@ -132,17 +134,17 @@ is $date.month, 6, 'Date month'; # test 23 is $date.day, 4, 'Date day'; # test 24 -# --------------------------------------------------------------- - +# -------------------------------------------------------------------- +#`⁆ sub dt { DateTime.new(year => 1984, |%_); } sub ds (Str $s) { DateTime.new($s) } sub ymd ($y, $m, $d) { DateTime.new(year => $y, month => $m, day => $d); } my $now = DateTime.now; - -# --------------------------------------------------------------- +#`⁅ +# -------------------------------------------------------------------- # Input validation -# --------------------------------------------------------------- +# -------------------------------------------------------------------- # L<S32::Temporal/'C<DateTime>'/outside of the ranges specified> @@ -197,9 +199,9 @@ lives_ok { $now.set(second => 61.5) }, 'DateTime accepts second 61.5 (.set)'; dies_ok { $now.set(second => 62) }, 'DateTime rejects second 62 (.set)'; -# --------------------------------------------------------------- +# -------------------------------------------------------------------- # L<S32::Temporal/'"Get" methods'/'The method C<whole-second>'> -# --------------------------------------------------------------- +# -------------------------------------------------------------------- is dt(second => 22).whole-second, 22, 'DateTime.whole-second (22)'; is dt(second => 22.1).whole-second, 22, 'DateTime.whole-second (22.1)'; @@ -209,9 +211,9 @@ is dt(second => 60).whole-second, 60, 'DateTime.whole-second (60)'; is dt(second => 60.5).whole-second, 60, 'DateTime.whole-second (60.5)'; -# --------------------------------------------------------------- +# -------------------------------------------------------------------- # L<S32::Temporal/'"Get" methods'/'The method C<week>'> -# --------------------------------------------------------------- +# -------------------------------------------------------------------- is ymd(1977, 8, 20).week.join(' '), '1977 33', 'DateTime.week (1977-8-20)'; is ymd(1977, 8, 20).week-year, 1977, 'DateTime.week (1977-8-20)'; @@ -238,14 +240,121 @@ is ymd(2010, 01, 03).week-year, 2009, 'DateTime.week-year (2010-01-03)'; is ymd(2010, 01, 03).week-number, 53, 'DateTime.week-number (2010-01-03)'; -# --------------------------------------------------------------- +# -------------------------------------------------------------------- # L<S32::Temporal/'"Get" methods'/"also $dt.date('-')"> -# --------------------------------------------------------------- +# -------------------------------------------------------------------- is $now.date, $now.ymd, 'DateTime.ymd can be spelled as DateTime.date'; is $now.time, $now.hms, 'DateTime.hms can be spelled as DateTime.time'; +# -------------------------------------------------------------------- +# L<S32::Temporal/'"Set" methods'/'The C<truncate> method'> +# -------------------------------------------------------------------- + +{ + my $moon-landing = dt # Although the seconds part is fictional. + year => 1969, month => 6, day => 20, + hour => 8, minute => 17, second => 32.4; + + my $dt = $moon-landing.clone; $dt.truncate(to => 'second'); + is $dt.second, 32, 'DateTime.truncate(to => "second")'; + $dt = $moon-landing.clone; $dt.truncate(to => 'minute'); + is $dt.iso8601, '1969-06-20T08:17:00+0000', 'DateTime.truncate(to => "minute")'; + $dt = $moon-landing.clone; $dt.truncate(to => 'hour'); + is $dt.iso8601, '1969-06-20T08:00:00+0000', 'DateTime.truncate(to => "hour")'; + $dt = $moon-landing.clone; $dt.truncate(to => 'day'); + is $dt.iso8601, '1969-06-20T00:00:00+0000', 'DateTime.truncate(to => "day")'; + $dt = $moon-landing.clone; $dt.truncate(to => 'month'); + is $dt.iso8601, '1969-06-01T00:00:00+0000', 'DateTime.truncate(to => "month")'; + $dt = $moon-landing.clone; $dt.truncate(to => 'year'); + is $dt.iso8601, '1969-01-01T00:00:00+0000', 'DateTime.truncate(to => "year")'; + + $dt = ymd 1999, 1, 18; $dt.truncate(to => 'week'); + is $dt.iso8601, '1999-01-18T00:00:00+0000', 'DateTime.truncate(to => "week") (no change in day)'; + $dt = ymd 1999, 1, 19; $dt.truncate(to => 'week'); + is $dt.iso8601, '1999-01-18T00:00:00+0000', 'DateTime.truncate(to => "week") (short jump)'; + $dt = ymd 1999, 1, 17; $dt.truncate(to => 'week'); + is $dt.iso8601, '1999-01-11T00:00:00+0000', 'DateTime.truncate(to => "week") (long jump)'; + $dt = ymd 1999, 4, 2; $dt.truncate(to => 'week'); + is $dt.iso8601, '1999-03-29T00:00:00+0000', 'DateTime.truncate(to => "week") (changing month)'; + $dt = ymd 1999, 1, 3; $dt.truncate(to => 'week'); + is $dt.iso8601, '1998-12-28T00:00:00+0000', 'DateTime.truncate(to => "week") (changing year)'; + $dt = ymd 2000, 3, 1; $dt.truncate(to => 'week'); + is $dt.iso8601, '2000-02-28T00:00:00+0000', 'DateTime.truncate(to => "week") (skipping over Leap Day)'; + $dt = ymd 1988, 3, 3; $dt.truncate(to => 'week'); + is $dt.iso8601, '1988-02-29T00:00:00+0000', 'DateTime.truncate(to => "week") (landing on Leap Day)'; +} + +# -------------------------------------------------------------------- +# L<S32::Temporal/'"Get" methods'/'The C<day-of-year> method'> +# -------------------------------------------------------------------- + +is ymd(1975, 1, 1).day-of-year, 1, 'DateTime.day-of-year (1975-01-01)'; +is ymd(1977, 5, 5).day-of-year, 125, 'DateTime.day-of-year (1977-05-05)'; +is ymd(1983, 11, 27).day-of-year, 331, 'DateTime.day-of-year (1983-11-27)'; +is ymd(1999, 2, 28).day-of-year, 59, 'DateTime.day-of-year (1999-02-28)'; +is ymd(1999, 3, 1).day-of-year, 60, 'DateTime.day-of-year (1999-03-01)'; +is ymd(1999, 12, 31).day-of-year, 365, 'DateTime.day-of-year (1999-12-31)'; +is ymd(2000, 2, 28).day-of-year, 59, 'DateTime.day-of-year (2000-02-28)'; +is ymd(2000, 2, 29).day-of-year, 60, 'DateTime.day-of-year (2000-02-29)'; +is ymd(2000, 3, 1).day-of-year, 61, 'DateTime.day-of-year (2000-03-01)'; +is ymd(2000, 12, 31).day-of-year, 366, 'DateTime.day-of-year (2000-12-31)'; + +# -------------------------------------------------------------------- +# L<S32::Temporal/'"Get" methods'/'The C<weekday-of-month> method'> +# -------------------------------------------------------------------- + +is ymd(1982, 2, 1).weekday-of-month, 1, 'DateTime.weekday-of-month (1982-02-01)'; +is ymd(1982, 2, 7).weekday-of-month, 1, 'DateTime.weekday-of-month (1982-02-07)'; +is ymd(1982, 2, 8).weekday-of-month, 2, 'DateTime.weekday-of-month (1982-02-08)'; +is ymd(1982, 2, 18).weekday-of-month, 3, 'DateTime.weekday-of-month (1982-02-18)'; +is ymd(1982, 2, 28).weekday-of-month, 4, 'DateTime.weekday-of-month (1982-02-28)'; +is ymd(1982, 4, 4).weekday-of-month, 1, 'DateTime.weekday-of-month (1982-04-04)'; +is ymd(1982, 4, 7).weekday-of-month, 1, 'DateTime.weekday-of-month (1982-04-07)'; +is ymd(1982, 4, 8).weekday-of-month, 2, 'DateTime.weekday-of-month (1982-04-08)'; +is ymd(1982, 4, 13).weekday-of-month, 2, 'DateTime.weekday-of-month (1982-04-13)'; +is ymd(1982, 4, 30).weekday-of-month, 5, 'DateTime.weekday-of-month (1982-04-30)'; + +# -------------------------------------------------------------------- +# L<S32::Temporal/'"Set" methods'/adjust the time zone> +# -------------------------------------------------------------------- + +# We use $dt.set(timezone => FOO) instead of $dt.timezone = FOO +# because Rakudo hasn't yet implemented the latter. + +{ + sub t0($tz) { ds "2005-02-04T15:25:00$tz" } + + say 'a'; + my $dt = t0 '+0900'; $dt.set(timezone => '+0600'); + is $dt.hour, 12, 'Changing time zones'; + + $dt = t0 '+0200'; $dt.set(timezone => '+0400'); + is $dt.iso8601, '2005-02-04T17:25:00+0400', 'Changing time zones'; + $dt = t0 '+0000'; $dt.set(timezone => '-0100'); + is $dt.iso8601, '2005-02-04T14:25:00-0100', 'Changing time zones'; + $dt = t0 '+0100'; $dt.set(timezone => '-0100'); + is $dt.iso8601, '2005-02-04T13:25:00-0100', 'Changing time zones'; + $dt = t0 '-0200'; $dt.set(timezone => '-0500'); + is $dt.iso8601, '2005-02-04T12:25:00-0500', 'Changing time zones'; + $dt = t0 '+0000'; $dt.set(timezone => '-0013'); + is $dt.iso8601, '2005-02-04T15:12:00-0013', 'Changing time zones (minus minutes)'; + $dt = t0 '+0000'; $dt.set(timezone => '-0027'); + is $dt.iso8601, '2005-02-04T14:58:00-0027', 'Changing time zones (hour rollover 1)'; + $dt = t0 '+0000'; $dt.set(timezone => '+0044'); + is $dt.iso8601, '2005-02-04T16:09:00+0044', 'Changing time zones (hour rollover 2)'; + $dt = t0 '+0311'; $dt.set(timezone => '-0227'); + is $dt.iso8601, '2005-02-04T09:47:00-0227', 'Changing time zones (hours and minutes)'; + $dt = t0 '+0000'; $dt.set(timezone => '-1855'); + is $dt.iso8601, '2005-02-03T20:30:00-1855', 'Changing time zones (day rollover)'; + $dt = ds "2005-01-01T02:22:00+0300"; $dt.set(timezone => '+0035'); + is $dt.iso8601, '2004-12-31T23:57:00+0035', 'Changing time zones (year rollover)'; +} +#`⁆ + + # TODO: day-of-month +# TODO: offset done_testing;