use strict;
use DateTime;
use Time::Local;

die "Usage: perl xEpoch.pl yr month dd hh minute ss\n" 
    unless @ARGV == 6;

my $yr = $ARGV[0];
my $month = $ARGV[1];
my $dd = $ARGV[2];
my $hh = $ARGV[3];
my $minute = $ARGV[4];
my $ss = $ARGV[5];

print "Epoch for $yr$month$dd:$hh$minute$ss (UTC) = \t",
    Epoch($yr, $month, $dd, $hh, $minute, $ss, 'UTC'), 
    "\tbased on Epoch().\n";

# timegm cannot handle an input that represents a legit leap second.
print "Epoch for $yr$month$dd:$hh$minute$ss (UTC) = \t",
    timegm($ss, $minute, $hh, $dd, $month-1, ($yr<1900?$yr-1900:$yr)), 
    "\tbased on timegm().\n";

print "Epoch for $yr$month$dd:$hh$minute$ss (NYC) = \t",
    Epoch($yr, $month, $dd, $hh, $minute, $ss, 'America/New_York'), 
    "\tbased on Epoch().\n";

# timelocal cannot handle an input that represents a legit leap second.
print "Epoch for $yr$month$dd:$hh$minute$ss (NYC) = \t",
    timelocal($ss, $minute, $hh, $dd, $month-1, ($yr<1900?$yr-1900:$yr)), 
    "\tbased on timelocal().\n";


sub Epoch {
    #Inputs:
    my $yyyy = $_[0];
    my $month = $_[1];
    my $dd = $_[2];
    my $hh = $_[3];
    my $minute = $_[4];
    my $ss = $_[5];
    my $tz = $_[6];

    my $epoch;
    eval { # Use error trapping in case an invalid timestamp is provided.
        my $dt = DateTime->new(
                               year        => $yyyy,
                               month       => $month,
                               day         => $dd,
                               hour        => $hh,
                               minute      => $minute,
                               second      => $ss,
                               time_zone   => $tz);
        $epoch = $dt->epoch;
    };
    if ($@) {                   # Report the error msg in $@.
        $epoch = "Err BaseCamp::Epoch: $yyyy:$month:$dd:$hh:$minute:$ss:$tz --> "
         . $@;
        print STDERR "$epoch\n";
    }
    return $epoch;
}
