sub dt_from_string {
my ( $date_string, $date_format, $tz ) = @_;
- if ( !$tz ) {
- $tz = C4::Context->tz;
- }
+
+
+ # FIXME: see bug 13242 => no TZ for dates 'infinite'
+ return DateTime::Format::DateParse->parse_datetime($date_string)
+ if $date_string and $date_string =~ /^9999-/;
+
+ my $dt;
+ $tz ||= C4::Context->tz;
if ( !$date_format ) {
$date_format = C4::Context->preference('dateformat');
}
$date_string =~ s/00T/01T/;
}
}
- return DateTime::Format::DateParse->parse_datetime( $date_string,
- $tz->name() );
+
+ $dt = eval {
+ DateTime::Format::DateParse->parse_datetime( $date_string,
+ $tz->name() );
+ };
+ if ($@) {
+ $tz = DateTime::TimeZone->new( name => 'floating' );
+ $dt = DateTime::Format::DateParse->parse_datetime( $date_string,
+ $tz->name() );
+ }
+ } else {
+ $dt = DateTime->now( time_zone => $tz );
}
- return DateTime->now( time_zone => $tz );
+
+ return $dt;
}
return "" unless $text;
$config->{with_hours} //= 0;
- my $tz = DateTime::TimeZone->new(name => 'floating') unless $config->{with_hours};
- my $dt = dt_from_string( $text, 'iso', $tz );
+ my $dt = dt_from_string( $text, 'iso' );
return $config->{as_due_date} ?
output_pref({ dt => $dt, as_due_date => 1 }) :
use DateTime::TimeZone;
use C4::Context;
-use Test::More tests => 34;
+use Test::More tests => 36;
use Test::MockModule;
BEGIN { use_ok('Koha::DateUtils'); }
cmp_ok $date_string, 'eq', '11/12/2013 18:35', 'as_due_date with hours and timeformat 24hr (non-midnight time)';
$date_string = output_pref({ dt => $dt, dateformat => 'us', timeformat => '12hr', as_due_date => 1 });
cmp_ok $date_string, 'eq', '12/11/2013 06:35 PM', 'as_due_date with hours and timeformat 12hr (non-midnight time)';
+
+my $now = DateTime->now;
+is( dt_from_string, $now, "Without parameter, dt_from_string should return today" );
+
+$module_context->mock(
+ 'tz',
+ sub {
+ return DateTime::TimeZone->new( name => 'Europe/Lisbon' );
+ }
+);
+
+$dt = dt_from_string('1979-04-01');
+isa_ok( $dt, 'DateTime', 'dt_from_string should return a DateTime object if a DST is given' );
+
+$module_context->mock(
+ 'tz',
+ sub {
+ return DateTime::TimeZone->new( name => 'Europe/Paris' );
+ }
+);
+
+$dt = dt_from_string('2014-03-30 02:00:00');
+isa_ok( $dt, 'DateTime', 'dt_from_string should return a DateTime object if a DST is given' );
#!/usr/bin/perl
-#
-use strict;
-use warnings;
+use Modern::Perl;
use C4::Context;
use C4::Dates;
-use Test::More tests => 5;
+use Test::More tests => 7;
+use Test::MockModule;
BEGIN {
use_ok('Koha::Template::Plugin::KohaDates');
}
+my $module_context = new Test::MockModule('C4::Context');
+
my $date = "1973-05-21";
my $context = C4::Context->new();
my $dateobj = C4::Dates->new();
my $filter = Koha::Template::Plugin::KohaDates->new();
ok ($filter, "new()");
-
$context->set_preference( "dateformat", 'iso' );
$context->clear_syspref_cache();
$dateobj->reset_prefformat;
$filtered_date = $filter->filter($date);
is ($filtered_date,'21/05/1973', "metric conversion") or diag ("metric conversion fails $filtered_date");
+
+$module_context->mock(
+ 'tz',
+ sub {
+ return DateTime::TimeZone->new( name => 'Europe/Lisbon' );
+ }
+);
+
+$filtered_date = $filter->filter('1979-04-01');
+is( $filtered_date, '01/04/1979', 'us: dt_from_string should return the valid date if a DST is given' );
+
+$module_context->mock(
+ 'tz',
+ sub {
+ return DateTime::TimeZone->new( name => 'Europe/Paris' );
+ }
+);
+
+$filtered_date = $filter->filter('2014-03-30 02:00:00');
+is( $filtered_date, '30/03/2014', 'us: dt_from_string should return a DateTime object if a DST is given' );