Home > Blockchain >  Is it the right way to add/subtract GMT related hours to UTC time
Is it the right way to add/subtract GMT related hours to UTC time

Time:04-14

I have a UTC date timezone aware, and I would like to add/substract hours which are UTC aware ( /- hours from GMT/UTC). Meaning -4:00 hours are 4 hours behind UTC date time etc. I'm running the bellow code which is working, but it feels like there is a better way. Please confirm/infirm.

PS: I saw a few urls with examples showing how to change the time zone which I want to avoid because of DST.

from datetime import datetime, timedelta
import pytz

# Date aware of time zone
today_date = datetime.today().utcnow().replace(hour=0, minute=0, second=0, microsecond=0, tzinfo=pytz.UTC)
print(today_date)

# UTC datetime (-) Hours from is defined as:
time_zone_to_utc_suffix: str = '-4:00' # I receive the data in str
time_zone_to_utc_hours:int = int(time_zone_to_utc_suffix.split(':')[0])

#### THE PART I FEEL CAN BE IMPROVED ######
result_date_adjusted_into_utc = today_date   timedelta(hours=time_zone_to_utc_hours)

print(f'Date adjusted by {time_zone_to_utc_hours} hours, is {result_date_adjusted_into_utc}')

Tx

CodePudding user response:

You wrote "add/substract hours which are UTC aware" I think you are misunderstanding what "time zone aware" means. Your date is indeed time zone aware, you correctly constructed it like this:

today_date = datetime.today().utcnow().replace(hour=0, minute=0, second=0, microsecond=0, tzinfo=pytz.UTC)

There's other ways to achieve the same, but this is fine.

However, there is no such thing as a time zone aware interval of 4 hours. 4 hours is 4 hours, no matter where you are on the planet. Only the resulting time after you add or subtract an interval can be time zone aware, or not.

If you add 4 hours to a time zone aware time, it's still in the same time zone, just 4 hours later:

right_now = datetime.today().utcnow().replace(tzinfo=pytz.UTC)
four_hours_later = right_now   timedelta(hours=4)

The value of four_hours_later is still in the UTC zone, just 4 hours later.

If you want to compute what the same time is in a time zone that's 4 hours ahead, i.e. in the ' 04:00' zone, you can do this:

from datetime import datetime, timezone
import pytz

right_now = datetime.today().utcnow().replace(tzinfo=pytz.UTC)
four_hours_later = right_now   timedelta(hours=4)
right_now_in_plus_4 = right_now.astimezone(timezone(timedelta(hours=4)))

print(right_now_in_plus_4)  # same time, different zone
print(four_hours_later)     # same zone, different time (4h later)

Typically, since you're already using pytz, you wouldn't want to use 4:00 or anything like that, but instead just the actual name of the timezone:

right_now_in_dubai = right_now.astimezone(pytz.timezone('asia/dubai'))
  • Related