1717import datetime
1818from typing import List , Optional
1919
20+ import pytz
21+
2022from .. import convert , utils
2123from ..client_base import DEFAULT
2224from ..client_default import Client
@@ -97,6 +99,7 @@ def directions(
9799 profile : Optional [str ] = "WALK,TRANSIT" ,
98100 date : Optional [datetime .date ] = datetime .datetime .now ().date (),
99101 time : Optional [datetime .time ] = datetime .datetime .now ().time (),
102+ timezone : Optional [str ] = "UTC" ,
100103 arrive_by : Optional [bool ] = False ,
101104 num_itineraries : Optional [int ] = 3 ,
102105 dry_run : Optional [bool ] = None ,
@@ -118,6 +121,10 @@ def directions(
118121 :param time: Time of departure or arrival. Default value: current time.
119122 :type time: datetime.time
120123
124+ :param timezone: Timezone used to transform output departure and arrival timestamps to naive
125+ datetimes. Default value: UTC.
126+ :type time: str
127+
121128 :arrive_by: Whether the itinerary should depart at the specified time (False), or arrive to
122129 the destination at the specified time (True). Default value: False.
123130 :type arrive_by: bool
@@ -165,21 +172,22 @@ def directions(
165172 response = self .client ._request (
166173 "/otp/routers/default/index/graphql" , post_params = params , dry_run = dry_run
167174 )
168- return self ._parse_directions_response (response , num_itineraries )
175+ return self ._parse_directions_response (response , num_itineraries , timezone )
169176
170- def _timestamp_to_utc_datetime (self , timestamp ):
177+ def _timestamp_to_naive_datetime (self , timestamp , timezone ):
171178 dt = datetime .datetime .fromtimestamp (timestamp / 1000 )
172- return dt .astimezone (datetime .timezone .utc )
179+ aware_dt = dt .astimezone (pytz .timezone (timezone ))
180+ return aware_dt .replace (tzinfo = None )
173181
174- def _parse_directions_response (self , response , num_itineraries ):
182+ def _parse_directions_response (self , response , num_itineraries , timezone ):
175183 if response is None : # pragma: no cover
176184 return Directions () if num_itineraries > 1 else Direction ()
177185
178186 directions = []
179187 for itinerary in response ["data" ]["plan" ]["itineraries" ]:
180188 distance , geometry = self ._parse_legs (itinerary ["legs" ])
181- departure_datetime = self ._timestamp_to_utc_datetime (itinerary ["startTime" ])
182- arrival_datetime = self ._timestamp_to_utc_datetime (itinerary ["endTime" ])
189+ departure_datetime = self ._timestamp_to_naive_datetime (itinerary ["startTime" ], timezone )
190+ arrival_datetime = self ._timestamp_to_naive_datetime (itinerary ["endTime" ], timezone )
183191 directions .append (
184192 Direction (
185193 geometry = geometry ,
@@ -202,7 +210,7 @@ def _parse_legs(self, legs):
202210 geometry = []
203211 for leg in legs :
204212 points = utils .decode_polyline5 (leg ["legGeometry" ]["points" ])
205- geometry .extend (list ( reversed ( points )) )
213+ geometry .extend (points )
206214 distance += int (leg ["distance" ])
207215
208216 return distance , geometry
0 commit comments