import sys import argparse import dateparser from pytz.exceptions import UnknownTimeZoneError parser = argparse.ArgumentParser() parser.add_argument('human_dt', help="datetime-like string") parser.add_argument('human_tz', nargs='?', help="timezone-like or location string") parser.add_argument('--format', dest='format', default='%Y-%m-%d %H:%M:%S%z') args = parser.parse_args() human_dt = args.human_dt human_tz = args.human_tz try: # first try parsing the timezone from user input if human_tz: result = dateparser.parse(human_dt, settings={'TO_TIMEZONE': human_tz}) else: result = dateparser.parse(human_dt) except UnknownTimeZoneError: # we don't know this timezone one, assume location import random import string from geopy.geocoders import Nominatim from geopy.exc import GeocoderTimedOut from timezonefinder import TimezoneFinder user_agent = ''.join(random.choices(string.ascii_uppercase + string.digits, k=20)) geolocator = Nominatim(user_agent=user_agent) try: location = geolocator.geocode(human_tz) except GeocoderTimedOut: print("Timed out resolving location. Try specifying a timezone directly", file=sys.stderr) exit(1) tzf = TimezoneFinder() loc_tz = tzf.timezone_at(lng=location.longitude, lat=location.latitude) result = dateparser.parse(human_dt, settings={'TO_TIMEZONE': loc_tz}) if result is None: print("Could not parse '{human_dt}' or '{human_tz}'".format(human_dt, human_tz), file=sys.stderr) exit(1) formatted_result = result.strftime(args.format) print(formatted_result)