The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::SD::Util;
use Any::Moose; # for warnings and strict at the least
use DateTime;
use Params::Validate qw/:all/;

my %MONTHS = ( jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6, jul => 7, aug => 8, sep => 9, oct => 10, nov => 11, dec => 12);

sub string_to_datetime {
    my ($date)= validate_pos(@_, { type => SCALAR | UNDEF} );

    return unless defined($date);

    if ($date =~ /^(\d{4})-(\d{2})-(\d{2})[T\s](\d{1,2}):(\d{2}):(\d{2})Z?$/ ){
        my ($year,$month,$day, $hour,$min,$sec) = ($1,$2,$3,$4,$5,$6);
        my $dt = DateTime->new( year => $year,
            month => $month,
            day => $day,
            hour => $hour,
            minute => $min,
            second => $sec,
            time_zone => 'GMT');
        return $dt;
    }

    if ( $date =~ m!^(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2}) ([-+]?\d{4})?! ) {
        # e.g. 2009/03/21 10:03:05 -0700
        my ( $year, $month, $day, $hour, $min, $sec, $tz ) =
        ( $1, $2, $3, $4, $5, $6, $7 );
        my $dt = DateTime->new(
            year      => $year,
            month     => $month,
            day       => $day,
            hour      => $hour,
            minute    => $min,
            second    => $sec,
            time_zone => $tz || 'GMT'
        );
        $dt->set_time_zone( 'GMT' );
        return $dt;
    }

    #Thu Jun 11 05:21:26 -0700 2009 - as github was broken on 2009-08-25
    if ($date =~ /^(\w{3}) (\w{3}) (\d+) (\d\d):(\d\d):(\d\d) ([+-]?\d{4}) (\d{4})$/) {
        my ( $wday, $mon, $day, $hour, $min, $sec, $tz, $year) = 
        ( $1, $2, $3, $4, $5, $6, $7, $8 );
        my $dt = DateTime->new(
            year      => $year,
            month     => $MONTHS{lc($mon)},
            day       => $day,
            hour      => $hour,
            minute    => $min,
            second    => $sec,
            time_zone => $tz || 'GMT'
        );
        $dt->set_time_zone( 'GMT' );
        return $dt;

    }

    if ($date) {
        require DateTime::Format::Natural;
        # XXX DO we want floating or GMT?
        my $parser = DateTime::Format::Natural->new(time_zone => 'floating');
        my $dt = $parser->parse_datetime($date);
        if ($parser->success) {
            return $dt;
        } 
    }

    return undef;
}

=head2 datetime_to_string($datetime)

Format datetime in a nice human-readable manner.

=cut

sub datetime_to_string {
    my $datetime = shift;

    return $datetime->date . q{ } . $datetime->time;
}

no Any::Moose;
1;