]> git.donarmstrong.com Git - deb_pkgs/libhtml-calendarmonth-perl.git/blobdiff - 1.25/lib/HTML/CalendarMonth/DateTool/DateTime.pm
[svn-upgrade] Tagging libhtml-calendarmonth-perl (1.25)
[deb_pkgs/libhtml-calendarmonth-perl.git] / 1.25 / lib / HTML / CalendarMonth / DateTool / DateTime.pm
diff --git a/1.25/lib/HTML/CalendarMonth/DateTool/DateTime.pm b/1.25/lib/HTML/CalendarMonth/DateTool/DateTime.pm
new file mode 100644 (file)
index 0000000..a0b98b3
--- /dev/null
@@ -0,0 +1,85 @@
+package HTML::CalendarMonth::DateTool::DateTime;
+BEGIN {
+  $HTML::CalendarMonth::DateTool::DateTime::VERSION = '1.25';
+}
+
+# Interface to DateTime
+
+use strict;
+use warnings;
+use Carp;
+
+use base qw( HTML::CalendarMonth::DateTool );
+
+use DateTime;
+
+sub dow1st_and_lastday {
+  my($self, $month, $year) = @_;
+  $month ||= $self->month;
+  $year  ||= $self->year;
+  my $lastday = $self->_last_dom_dt($year, $month);
+  my $dow1st = $self->dow(1);
+  ($dow1st, $lastday->day);
+}
+
+sub day_epoch {
+  my($self, $day, $month, $year) = @_;
+  $day || croak "day required.\n";
+  $month ||= $self->month;
+  $year  ||= $self->year;
+  my $dt = $self->_new_dt($year, $month, $day);
+  $dt->epoch;
+}
+
+sub dow {
+  my($self, $day, $month, $year) = @_;
+  $day || croak "day required.\n";
+  $month ||= $self->month;
+  $year  ||= $self->year;
+  my $dt = $self->_new_dt($year, $month, $day);
+  # convert from 1..7, starting with Mon, to 0..6, starting with Sun
+  $dt->dow % 7;
+}
+
+sub add_days {
+  my($self, $delta, $day, $month, $year) = @_;
+  defined $delta || croak "delta (in days) required.\n";
+  $day   || croak "day required.\n";
+  $month ||= $self->month;
+  $year  ||= $self->year;
+  my $dt = $self->_new_dt($year, $month, $day);
+  $dt->add(days => $delta);
+  ($dt->day, $dt->month, $dt->year);
+}
+
+sub week_of_year {
+  my($self, $day, $month, $year) = @_;
+  $day || croak "day required.\n";
+  $month ||= $self->month;
+  $year  ||= $self->year;
+  my $dt = $self->_new_dt($year, $month, $day);
+  # returns ($year, $week)
+  $dt->week;
+}
+
+sub _new_dt {
+  my $self = shift;
+  my($year, $month, $day) = @_;
+  $year or croak "year and month required\n";
+  my %parms = (year => $year);
+  $parms{month} = $month if $month;
+  $parms{day}   = $day    if $day;
+  $parms{hour} = 0;
+  $parms{minute} = 0;
+  $parms{second} = 0;
+  DateTime->new(%parms);
+}
+
+sub _last_dom_dt {
+  my $self = shift;
+  my($year, $month) = @_;
+  $year && $month or croak "year and month required.\n";
+  DateTime->last_day_of_month(year => $year, month => $month);
+}
+
+1;