This seems so basic, it’s almost embarrassing to publish, but this showed up a few times on Stackexchange. I had trouble figuring it out, too, partly because the Python docs are so lengthy.
The scenario: you have a textual timestamp with a timezone, and need to convert it to UTC. I had the former in and email date header, and needed it printed in UTC for the envelope.
The input looks like this:
Tue, 17 Mar 2009 18:57:55 -0300
from dateutil.parser import parse
from datetime import timezone, datetime, timedelta
t = parse("Tue, 17 Mar 2009 18:57:55 -0300")
## first way
tu = t.astimezone(timezone.utc)
## second way
tu = datetime.utcfromtimestamp(t.timestamp())
## and as text
text = tu.strftime("%c")
The main difference between the first and second ways is that the first way strips off the timezone info (tzinfo), so it become a “naive” datetime. The second way sets the tzinfo to utc, which is better.
Also, the Date lines in email headers varies, and taking a slice of [6:37] will chop off timezone markings like “(GMT-08:00)” that cause the parser to barf.