diff options
Diffstat (limited to 'lib/Travelynx/Controller/Traveling.pm')
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index fd2abb1..74bb5c6 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -1745,13 +1745,12 @@ sub map_history { my $with_polyline = $route_type eq 'beeline' ? 0 : 1; my $parser = DateTime::Format::Strptime->new( - pattern => '%d.%m.%Y', + pattern => '%F', locale => 'de_DE', time_zone => 'Europe/Berlin' ); - if ( $filter_from - and $filter_from =~ m{ ^ (\d+) [.] (\d+) [.] (\d+) $ }x ) + if ( $filter_from ) { $filter_from = $parser->parse_datetime($filter_from); } @@ -1759,8 +1758,7 @@ sub map_history { $filter_from = undef; } - if ( $filter_until - and $filter_until =~ m{ ^ (\d+) [.] (\d+) [.] (\d+) $ }x ) + if ( $filter_until ) { $filter_until = $parser->parse_datetime($filter_until)->set( hour => 23, @@ -2383,7 +2381,7 @@ sub edit_journey { if ( $self->param('action') and $self->param('action') eq 'save' ) { my $parser = DateTime::Format::Strptime->new( - pattern => '%d.%m.%Y %H:%M', + pattern => '%FT%H:%M', locale => 'de_DE', time_zone => 'Europe/Berlin' ); @@ -2486,7 +2484,7 @@ sub edit_journey { for my $key (qw(sched_departure rt_departure sched_arrival rt_arrival)) { if ( $journey->{$key} and $journey->{$key}->epoch ) { $self->param( - $key => $journey->{$key}->strftime('%d.%m.%Y %H:%M') ); + $key => $journey->{$key}->strftime('%FT%H:%M') ); } } @@ -2518,7 +2516,7 @@ sub add_journey_form { if ( $self->param('action') and $self->param('action') eq 'save' ) { my $parser = DateTime::Format::Strptime->new( - pattern => '%d.%m.%Y %H:%M', + pattern => '%FT%H:%M', locale => 'de_DE', time_zone => 'Europe/Berlin' ); @@ -2619,7 +2617,12 @@ sub add_intransit_form { if ( $self->param('action') and $self->param('action') eq 'save' ) { my $parser = DateTime::Format::Strptime->new( - pattern => '%d.%m.%Y %H:%M', + pattern => '%FT%H:%M', + locale => 'de_DE', + time_zone => 'Europe/Berlin' + ); + my $time_parser = DateTime::Format::Strptime->new( + pattern => '%H:%M', locale => 'de_DE', time_zone => 'Europe/Berlin' ); @@ -2710,7 +2713,7 @@ sub add_intransit_form { if ( $trip{route} ) { my @unknown_stations; - my $prev_epoch; + my $prev_ts = $trip{sched_departure}; for my $station ( @{ $trip{route} } ) { my $ts; my %station_data; @@ -2719,11 +2722,30 @@ sub add_intransit_form { ) { $station = $+{stop}; - $ts = $parser->parse_datetime( $+{timestamp} ); - if ( $ts and $ts->epoch > $prev_epoch ) { + # attempt to parse "07:08" short timestamp first + $ts = $time_parser->parse_datetime( $+{timestamp} ); + if ( $ts ) { + # fill in last stop's (or at the first stop, our departure's) + # date to complete the datetime + $ts = $ts->set( + year => $prev_ts->year, + month => $prev_ts->month, + day => $prev_ts->day + ); + # if we go back in time with this, assume we went + # over midnight and add a day, e.g. in case of a stop + # at 23:00 followed by one at 01:30 + if ($ts < $prev_ts) { + $ts = $ts->add( days => 1 ); + } + } else { + # do a full datetime parse + $ts = $parser->parse_datetime( $+{timestamp} ); + } + if ( $ts and $ts >= $prev_ts ) { $station_data{sched_arr} = $ts->epoch; $station_data{sched_dep} = $ts->epoch; - $prev_epoch = $ts->epoch; + $prev_ts = $ts; } else { $self->render( |