package SOAP::WSDL::XSD::Typelib::Builtin::dateTime;
use strict;
use warnings;
use Date::Parse;
use Date::Format;
use Class::Std::Fast::Storable constructor => 'none', cache => 1;
use base qw(SOAP::WSDL::XSD::Typelib::Builtin::anySimpleType);
sub set_value {
# use set_value from base class if we have a XML-DateTime format
#2037-12-31T00:00:00.0000000+01:00
return $_[0]->SUPER::set_value( $_[1] ) if not defined $_[1];
return $_[0]->SUPER::set_value( $_[1] )
if (
$_[1] =~ m{ ^\d{4} \- \d{2} \- \d{2}
T \d{2} \: \d{2} \: \d{2} (:? \. \d{1,7} )?
[\+\-] \d{2} \: \d{2} $
}xms
);
# strptime sets empty values to undef - and strftime doesn't like that...
my @time_from = strptime( $_[1] );
die "Illegal date" if not defined $time_from[5];
# strftime doesn't like undefs
@time_from = map { !defined $_ ? 0 : $_ } @time_from;
my $time_str;
if ( $time_from[-1] ) {
$time_str = sprintf(
'%04d-%02d-%02dT%02d:%02d:%02d.0000000%+03d:%02d',
$time_from[5] + 1900,
$time_from[4] + 1,
$time_from[3],
$time_from[2],
$time_from[1],
$time_from[0],
int( $time_from[6] / 3600 ),
int( $time_from[6] % 3600 ) / 60
);
}
else {
$time_str = strftime( '%Y-%m-%dT%H:%M:%S%z', @time_from );
substr $time_str, -2, 0, ':';
}
$_[0]->SUPER::set_value($time_str);
}
1;