]> git.donarmstrong.com Git - deb_pkgs/libhtml-calendarmonth-perl.git/blob - lib/HTML/CalendarMonth/DateTool/DateManip.pm
3ed893c1163ad0705e4803e8ae56eff7a7eac6d0
[deb_pkgs/libhtml-calendarmonth-perl.git] / lib / HTML / CalendarMonth / DateTool / DateManip.pm
1 package HTML::CalendarMonth::DateTool::DateManip;
2
3 # Interface to Date::Manip
4
5 use strict;
6 use Carp;
7
8 use vars qw(@ISA $VERSION);
9
10 @ISA = qw(HTML::CalendarMonth::DateTool);
11
12 $VERSION = '0.02';
13
14 use Date::Manip qw(Date_DaysInMonth Date_DayOfWeek DateCalc
15                    UnixDate Date_SecsSince1970);
16
17 sub dow1st_and_lastday {
18   my($self, $month, $year) = @_;
19   $month ||= $self->month;
20   $year  ||= $self->year;
21   my $lastday = Date_DaysInMonth($month, $year);
22   # Date::Manip uses 1 for Monday, 7 for Sunday as well.
23   my $dow1st = $self->dow(1);
24   ($dow1st, $lastday);
25 }
26
27 sub day_epoch {
28   my($self, $day, $month, $year) = @_;
29   $day || croak "Day required.\n";
30   $month ||= $self->month;
31   $year  ||= $self->year;
32   Date_SecsSince1970($month, $day, $year, 0, 0, 0);
33 }
34
35 sub dow {
36   # Date::Manip uses 1..7 as indicies in the week, starting with Monday.
37   # Internally, we use 0..6, starting with Sunday. These turn out to be
38   # identical except for Sunday.
39   my($self, $day, $month, $year) = @_;
40   $day || croak "Day required.\n";
41   $month ||= $self->month;
42   $year  ||= $self->year;
43   my $dow = Date_DayOfWeek($month, $day, $year);
44   $dow = 0 if $dow == 7;
45   $dow;
46 }
47
48 sub add_days {
49   my($self, $delta, $day, $month, $year) = @_;
50   defined $delta || croak "Delta (in days) required.\n";
51   $day   || croak "Day required.\n";
52   $month ||= $self->month;
53   $year  ||= $self->year;
54   my $date = DateCalc(sprintf("%04d%02d%02d", $year, $month, $day),
55                       ($delta < 0 ? '':'+')." $delta days");
56   my($y, $m, $d) = $date =~ /^(\d{4})(\d\d)(\d\d)/;
57   $_ += 0 foreach ($y, $m, $d);
58   ($d, $m, $y);
59 }
60
61 sub week_of_year {
62   my($self, $day, $month, $year) = @_;
63   $day || croak "Day required.\n";
64   $month ||= $self->month;
65   $year  ||= $self->year;
66   my $week = UnixDate(sprintf("%04d%02d%02d", $year, $month, $day), '%U');
67   $week += 0;
68   ($year, $week);
69 }
70
71 1;