First timezones are evil, but sometimes you need to work with them. Sometimes is easy to consume some third party api to get timezone information based on a given location using geocoding but there also exists some alternatives.
The project timezone boundary builder provide in their releases a shapefile that can be imported into a postgresql database with postgis
the file that we need is
timezones.shapefile.zip the content :
├── dist │ ├── combined-shapefile.dbf │ ├── combined-shapefile.prj │ ├── combined-shapefile.shp │ └── combined-shapefile.shx
Setup the database, is asumed that postgis is already installed in the system:
-- pgsql service=local_server CREATE DATABASE tzdb; \c tzdb CREATE EXTENSION postgis;
Import the data into the database:
# shp2pgsql will create a table in the database # and pipe the shape data in postgresql dump format. shp2pgsql -D combined-shapefile.shp timezones | psql -U <db user> -d tzdb
The table now should contains 3 columns
gid an id,
tzid timezone name and
geom shape geometry (multypolygon)
from here we can test the timezone lookup in the database using the postgis functions like this:
-- latitude: 12, longitude: -86 SELECT gid, tzid FROM timezones WHERE st_contains(geom, st_makepoint(-86, 12)); -- expected result gid | tzid -----+----------------- 136 | America/Managua (1 row)
Next post would be the fastapi setup to make use of the data and expose an endpoint to query the timezone.