51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
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)
|