如果您不想使用除datetime
之外的任何其他模块,那么这个答案应该会有所帮助。
datetime.utcfromtimestamp(timestamp)
返回一个“naive”(非时区感知)的datetime
对象。时区感知和非时区感知的对象是不同的,前者可以处理时区信息,而后者不行。如果你要在多个时区之间进行转换(例如在UTC时间和本地时间之间),则需要使用时区感知对象。
如果您不能自己实例化日期时间对象,但仍可以创建一个用于表示UTC时间的“naive” datetime
对象,则可以尝试使用以下Python 3.x代码进行转换:
import datetime
d=datetime.datetime.strptime("2011-01-21 02:37:21", "%Y-%m-%d %H:%M:%S") #Get your naive datetime object
d=d.replace(tzinfo=datetime.timezone.utc) #Convert it to an aware datetime object in UTC time.
d=d.astimezone() #Convert it to your local timezone (still aware)
print(d.strftime("%d %b %Y (%I:%M:%S:%f %p) %Z")) #Print it with a directive of choice
要小心不要错误地认为,如果您的时区当前为MDT,夏令时与上述代码不兼容,因为它打印MST。请注意,如果您将月份更改为8月,它将打印MDT。
另一种获取带有时区意识的datetime
对象的简单方法(在Python 3.x中)是最初指定具有时区的对象。以下是一个示例,使用UTC:
import datetime, sys
aware_utc_dt_obj=datetime.datetime.now(datetime.timezone.utc) #create an aware datetime object
dt_obj_local=aware_utc_dt_obj.astimezone() #convert it to local time
#The following section is just code for a directive I made that I liked.
if sys.platform=="win32":
directive="%#d %b %Y (%#I:%M:%S:%f %p) %Z"
else:
directive="%-d %b %Y (%-I:%M:%S:%f %p) %Z"
print(dt_obj_local.strftime(directive))
如果您使用的是Python 2.x版本,您可能需要创建datetime.tzinfo
的子类,并使用它来帮助您创建一个"aware"的datetime
对象,因为在Python 2.x中不存在datetime.timezone
。