我有一个使用datetime.utcnow()创建的python datetime实例,并持久化在数据库中。
为了显示,我想使用默认的本地时区将从数据库检索到的datetime实例转换为本地datetime(即,就像使用datetime.now()创建的datetime一样)。
如何将UTC日期时间转换为本地日期时间仅使用python标准库(例如,没有pytz依赖)?
一种解决方案似乎是使用datetime.astimezone(tz),但是如何获得默认的本地时区呢?
我有一个使用datetime.utcnow()创建的python datetime实例,并持久化在数据库中。
为了显示,我想使用默认的本地时区将从数据库检索到的datetime实例转换为本地datetime(即,就像使用datetime.now()创建的datetime一样)。
如何将UTC日期时间转换为本地日期时间仅使用python标准库(例如,没有pytz依赖)?
一种解决方案似乎是使用datetime.astimezone(tz),但是如何获得默认的本地时区呢?
当前回答
下面是另一种在datetime格式中更改时区的方法(我知道我在这上面浪费了精力,但我没有看到这个页面,所以我不知道怎么做),没有min.和sec.因为我的项目不需要它:
def change_time_zone(year, month, day, hour):
hour = hour + 7 #<-- difference
if hour >= 24:
difference = hour - 24
hour = difference
day += 1
long_months = [1, 3, 5, 7, 8, 10, 12]
short_months = [4, 6, 9, 11]
if month in short_months:
if day >= 30:
day = 1
month += 1
if month > 12:
year += 1
elif month in long_months:
if day >= 31:
day = 1
month += 1
if month > 12:
year += 1
elif month == 2:
if not year%4==0:
if day >= 29:
day = 1
month += 1
if month > 12:
year += 1
else:
if day >= 28:
day = 1
month += 1
if month > 12:
year += 1
return datetime(int(year), int(month), int(day), int(hour), 00)
其他回答
针对特定情况: 输入utc datetime字符串。//通常来自日志 输出区域日期时间字符串。
def utc_to_locale(utc_str):
# from utc to locale
d1=datetime.fromisoformat(utc_str+'-00:00')
return d1.astimezone().strftime('%F %T.%f')[:-3]
测试:
>>> utc_to_locale('2022-02-14 00:49:06')
'2022-02-14 08:49:06.000'
>>> utc_to_locale('2022-02-14 00:49:06.123')
'2022-02-14 08:49:06.123'
>>> utc_to_locale('2022-02-14T00:49:06.123')
'2022-02-14 08:49:06.123'
我发现的最简单的方法是得到你所处位置的时间偏移量,然后从小时中减去它。
def format_time(ts,offset):
if not ts.hour >= offset:
ts = ts.replace(day=ts.day-1)
ts = ts.replace(hour=ts.hour-offset)
else:
ts = ts.replace(hour=ts.hour-offset)
return ts
在Python 3.5.2中,这对我来说是可行的。
标准的Python库根本没有任何tzinfo实现。我一直认为这是datetime模块的一个惊人缺点。
tzinfo类的文档中确实提供了一些有用的示例。在小节的末尾寻找大代码块。
根据阿列克谢的评论。这也适用于DST。
import time
import datetime
def utc_to_local(dt):
if time.localtime().tm_isdst:
return dt - datetime.timedelta(seconds = time.altzone)
else:
return dt - datetime.timedelta(seconds = time.timezone)
在Python 2和3中工作的简单(但可能有缺陷)方法:
import time
import datetime
def utc_to_local(dt):
return dt - datetime.timedelta(seconds = time.timezone)
它的优点是写一个逆函数很简单