From 592f27f4743c0a66b6634692fea6c3eb8f252814 Mon Sep 17 00:00:00 2001 From: Scott Gasch Date: Sun, 24 Oct 2021 18:06:20 -0700 Subject: [PATCH] Some fixes to the datetime_utils. --- datetime_utils.py | 55 +++++++++++++++++++++++++++++++++++++++++++++-- site_config.py | 2 +- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/datetime_utils.py b/datetime_utils.py index e31edc2..310ffe1 100644 --- a/datetime_utils.py +++ b/datetime_utils.py @@ -16,18 +16,69 @@ import constants logger = logging.getLogger(__name__) +def is_timezone_aware(dt: datetime.datetime) -> bool: + """See: https://docs.python.org/3/library/datetime.html + #determining-if-an-object-is-aware-or-naive + + >>> is_timezone_aware(datetime.datetime.now()) + False + + >>> is_timezone_aware(now_pacific()) + True + + """ + return ( + dt.tzinfo is not None and + dt.tzinfo.utcoffset(dt) is not None + ) + + +def is_timezone_naive(dt: datetime.datetime) -> bool: + return not is_timezone_aware(dt) + + def replace_timezone(dt: datetime.datetime, tz: datetime.tzinfo) -> datetime.datetime: """ - Replaces the timezone on a datetime object. + Replaces the timezone on a datetime object directly (leaving + the year, month, day, hour, minute, second, micro, etc... alone). + Note: this changes the instant to which this dt refers. >>> from pytz import UTC >>> d = now_pacific() >>> d.tzinfo.tzname(d)[0] # Note: could be PST or PDT 'P' + >>> h = d.hour >>> o = replace_timezone(d, UTC) >>> o.tzinfo.tzname(o) 'UTC' + >>> o.hour == h + True + + """ + return datetime.datetime( + dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, + tzinfo=tz + ) + + +def translate_timezone(dt: datetime.datetime, + tz: datetime.tzinfo) -> datetime.datetime: + """ + Translates dt into a different timezone by adjusting the year, month, + day, hour, minute, second, micro, etc... appropriately. The returned + dt is the same instant in another timezone. + + >>> from pytz import UTC + >>> d = now_pacific() + >>> d.tzinfo.tzname(d)[0] # Note: could be PST or PDT + 'P' + >>> h = d.hour + >>> o = translate_timezone(d, UTC) + >>> o.tzinfo.tzname(o) + 'UTC' + >>> o.hour == h + False """ return dt.replace(tzinfo=None).astimezone(tz=tz) @@ -44,7 +95,7 @@ def now_pacific() -> datetime.datetime: """ What time is it? Result in US/Pacific time (PST/PDT) """ - return replace_timezone(now(), pytz.timezone("US/Pacific")) + return datetime.datetime.now(pytz.timezone("US/Pacific")) def date_to_datetime(date: datetime.date) -> datetime.datetime: diff --git a/site_config.py b/site_config.py index 81185bf..95ff5d4 100644 --- a/site_config.py +++ b/site_config.py @@ -19,7 +19,7 @@ args.add_argument( const='AUTO', nargs='?', choices=('HOUSE', 'CABIN', 'AUTO'), - help='Where are we, HOUSE or CABIN?' + help='Where are we, HOUSE, CABIN or AUTO?', ) -- 2.45.2