From 16e6eb63a992941b420f63ad9cef9caa5115b851 Mon Sep 17 00:00:00 2001 From: networkException Date: Mon, 9 Jun 2025 13:41:26 +0200 Subject: Add option to specify time_zone for normalization This patch adds the option to MOTIS constructor calls to specify the timzone that should be used to normalize timestamps. --- lib/Travel/Status/MOTIS.pm | 20 +++++++++++++++----- lib/Travel/Status/MOTIS/Stopover.pm | 9 +++++---- lib/Travel/Status/MOTIS/Trip.pm | 16 ++++++++++------ lib/Travel/Status/MOTIS/TripAtStopover.pm | 5 ++++- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/lib/Travel/Status/MOTIS.pm b/lib/Travel/Status/MOTIS.pm index 7559d8f..eccad1b 100644 --- a/lib/Travel/Status/MOTIS.pm +++ b/lib/Travel/Status/MOTIS.pm @@ -59,6 +59,7 @@ sub new { results => [], station => $conf{station}, user_agent => $user_agent, + time_zone => 'local', }; bless( $self, $obj ); @@ -311,8 +312,10 @@ sub get_with_cache_p { sub parse_trip { my ( $self, %opt ) = @_; - $self->{result} - = Travel::Status::MOTIS::Trip->new( json => $self->{raw_json} ); + $self->{result} = Travel::Status::MOTIS::Trip->new( + json => $self->{raw_json}, + time_zone => $self->{time_zone}, + ); } sub parse_stops_by { @@ -330,9 +333,12 @@ sub parse_stops_by { sub parse_trips_at_stopover { my ($self) = @_; - @{ $self->{results} } - = map { Travel::Status::MOTIS::TripAtStopover->new( json => $_ ) } - @{ $self->{raw_json}{stopTimes} // [] }; + @{ $self->{results} } = map { + Travel::Status::MOTIS::TripAtStopover->new( + json => $_, + time_zone => $self->{time_zone}, + ) + } @{ $self->{raw_json}{stopTimes} // [] }; return $self; } @@ -522,6 +528,10 @@ Do not perform a request to MOTIS; load the prepared response provided in I instead. Note that you still need to specify B, B, etc. as appropriate. +=item B => I<$time_zone> + +A timezone to normalize timestamps to, defaults to 'local'. + =back =item my $promise = Travel::Status::MOTIS->new_p(I<%opt>) diff --git a/lib/Travel/Status/MOTIS/Stopover.pm b/lib/Travel/Status/MOTIS/Stopover.pm index 2c0c978..6535e79 100644 --- a/lib/Travel/Status/MOTIS/Stopover.pm +++ b/lib/Travel/Status/MOTIS/Stopover.pm @@ -41,6 +41,7 @@ sub new { my $json = $opt{json}; my $realtime = $opt{realtime} // 0; my $cancelled = $opt{cancelled}; + my $time_zone = $opt{time_zone}; my $ref = { stop => Travel::Status::MOTIS::Stop->from_stopover( json => $json ), @@ -52,25 +53,25 @@ sub new { if ( $json->{scheduledArrival} ) { $ref->{scheduled_arrival} = DateTime::Format::ISO8601->parse_datetime( $json->{scheduledArrival} ); - $ref->{scheduled_arrival}->set_time_zone('local'); + $ref->{scheduled_arrival}->set_time_zone( $time_zone ); } if ( $json->{arrival} and $realtime ) { $ref->{realtime_arrival} = DateTime::Format::ISO8601->parse_datetime( $json->{arrival} ); - $ref->{realtime_arrival}->set_time_zone('local'); + $ref->{realtime_arrival}->set_time_zone( $time_zone ); } if ( $json->{scheduledDeparture} ) { $ref->{scheduled_departure} = DateTime::Format::ISO8601->parse_datetime( $json->{scheduledDeparture} ); - $ref->{scheduled_departure}->set_time_zone('local'); + $ref->{scheduled_departure}->set_time_zone( $time_zone ); } if ( $json->{departure} and $realtime ) { $ref->{realtime_departure} = DateTime::Format::ISO8601->parse_datetime( $json->{departure} ); - $ref->{realtime_departure}->set_time_zone('local'); + $ref->{realtime_departure}->set_time_zone( $time_zone ); } if ( $ref->{scheduled_arrival} and $ref->{realtime_arrival} ) { diff --git a/lib/Travel/Status/MOTIS/Trip.pm b/lib/Travel/Status/MOTIS/Trip.pm index 161b4f7..7ba57ff 100644 --- a/lib/Travel/Status/MOTIS/Trip.pm +++ b/lib/Travel/Status/MOTIS/Trip.pm @@ -39,6 +39,7 @@ sub new { my ( $obj, %opt ) = @_; my $json = $opt{json}{legs}[0]; + my $time_zone = $opt{time_zone}; my $ref = { id => $json->{tripId}, @@ -54,16 +55,18 @@ sub new { raw_stopovers => [ $json->{from}, @{ $json->{intermediateStops} }, $json->{to} ], raw_polyline => $json->{legGeometry}->{points}, + + time_zone => $time_zone, }; $ref->{scheduled_departure} = DateTime::Format::ISO8601->parse_datetime( $json->{scheduledStartTime} ); - $ref->{scheduled_departure}->set_time_zone('local'); + $ref->{scheduled_departure}->set_time_zone( $time_zone ); if ( $json->{realTime} ) { $ref->{realtime_departure} = DateTime::Format::ISO8601->parse_datetime( $json->{startTime} ); - $ref->{realtime_departure}->set_time_zone('local'); + $ref->{realtime_departure}->set_time_zone( $time_zone ); } $ref->{departure} = $ref->{realtime_departure} @@ -71,12 +74,12 @@ sub new { $ref->{scheduled_arrival} = DateTime::Format::ISO8601->parse_datetime( $json->{scheduledEndTime} ); - $ref->{scheduled_arrival}->set_time_zone('local'); + $ref->{scheduled_arrival}->set_time_zone( $time_zone ); if ( $json->{realTime} ) { $ref->{realtime_arrival} = DateTime::Format::ISO8601->parse_datetime( $json->{endTime} ); - $ref->{realtime_arrival}->set_time_zone('local'); + $ref->{realtime_arrival}->set_time_zone( $time_zone ); } $ref->{arrival} = $ref->{realtime_arrival} // $ref->{scheduled_arrival}; @@ -154,8 +157,9 @@ sub stopovers { @{ $self->{stopovers} } = map { Travel::Status::MOTIS::Stopover->new( - json => $_, - realtime => $self->{is_realtime} + json => $_, + realtime => $self->{is_realtime}, + time_zone => $self->{time_zone}, ) } ( @{ $self->{raw_stopovers} // [] } ); diff --git a/lib/Travel/Status/MOTIS/TripAtStopover.pm b/lib/Travel/Status/MOTIS/TripAtStopover.pm index 2d58f98..6153045 100644 --- a/lib/Travel/Status/MOTIS/TripAtStopover.pm +++ b/lib/Travel/Status/MOTIS/TripAtStopover.pm @@ -29,7 +29,8 @@ Travel::Status::MOTIS::TripAtStopover->mk_ro_accessors( sub new { my ( $obj, %opt ) = @_; - my $json = $opt{json}; + my $json = $opt{json}; + my $time_zone = $opt{time_zone}; my $ref = { id => $json->{tripId}, @@ -48,6 +49,8 @@ sub new { # NOTE: $json->{place}->{cancelled} isn't set, we just override this here. cancelled => $json->{cancelled}, realtime => $json->{realTime}, + + time_zone => $time_zone, ), }; -- cgit v1.2.3