我试图从值中减去一个日期值datetime.today()来计算多久以前的东西.但它抱怨说:
TypeError: can't subtract offset-naive and offset-aware datetimes
Run Code Online (Sandbox Code Playgroud)
该值datetime.today()似乎不是"时区感知",而我的其他日期值是.如何获得值datetime.today()是时区的?现在它给我时间在当地时间,恰好是PST,即UTC-8hrs.最坏的情况是,有没有办法我可以手动输入时区值到datetime返回的对象datetime.today()并将其设置为UTC-8?当然,理想的解决方案是让它自动知道时区.
>>> import pytz
>>> pytz.timezone('Asia/Hong_Kong')
<DstTzInfo 'Asia/Hong_Kong' LMT+7:37:00 STD>
Run Code Online (Sandbox Code Playgroud)
7小时37分钟的偏移量?这有点奇怪,有没有人遇到同样的问题?
事实上,我之间的行为有所不同
import pytz
from datetime import datetime
hk = pytz.timezone('Asia/Hong_Kong')
dt1 = datetime(2012,1,1,tzinfo=hk)
dt2 = hk.localize(datetime(2012,1,1))
if dt1 > dt2:
print "Why?"
Run Code Online (Sandbox Code Playgroud) 我尝试使用datetime和pytz在python中创建一个datetime对象,显示的偏移是错误的.
import datetime
from pytz import timezone
start = datetime.datetime(2011, 6, 20, 0, 0, 0, 0, timezone('Asia/Kolkata'))
print start
Run Code Online (Sandbox Code Playgroud)
显示的输出是
datetime.datetime(2011, 6, 20, 0, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' HMT+5:53:00 STD>)
Run Code Online (Sandbox Code Playgroud)
请注意,'Asia/Kolkata'是IST,GMT + 5:30,而不是HMT + 5:53.这是一个标准的linux时区,为什么我会弄错,我该如何解决呢?
我有以下tzinfo具体的子类定义:
from datetime import datetime, timedelta, tzinfo
class ManilaTime(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=8)
def tzname(self, dt):
return "Manila"
Run Code Online (Sandbox Code Playgroud)
我获取了一个日期字符串,并希望将其转换为时区感知datetime对象.我更喜欢使用以下方法:
def transform_date(date_string, tzinfo):
fmt = '%Y-%m-%d'
# Where do I insert tzinfo?
date = datetime.strptime(date_string, fmt)
return date
Run Code Online (Sandbox Code Playgroud)
有什么方法可以通过以下方式插入tzinfo到datetime对象中?
manila = ManilaTime()
date = transform_date('2001-01-01', manila)
Run Code Online (Sandbox Code Playgroud) >>> now = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> now
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
>>> dt = datetime(now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, pytz.timezone('Asia/Tokyo'))
>>> dt
datetime.datetime(2018, 9, 7, 16, 9, 24, 177751, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)
Run Code Online (Sandbox Code Playgroud)
因为now我得到了JST + 9:00:00,因为dt我得到了LMT +9:19:00.我不明白为什么datetime使用不同的格式.
当我比较他们不同的时间时:
>>> now == dt
False
Run Code Online (Sandbox Code Playgroud)
我怎么能转换LMT到JST,这样now == dt …
所以我试图按日期过滤 django 模型。仅使用年、年+月或年+月+day_of_month。我现在使用的策略是这样的:
n.filter(create_date__year=q)
n.filter(create_date__year=q[:4],create_date__month=q[4:6])
n.filter(create_date__year=q[:4],create_date__month=q[4:6],create_date__day=q[6:8])
Run Code Online (Sandbox Code Playgroud)
其中 'q' 是格式分别为 'yyyy'、'yyyymm' 或 'yyyymmdd' 的日期字符串。
这工作得很好,但django 没有考虑时区。Django 基于 UTC 时间而不是 EDT 进行搜索,这是实际日期时间对象的设置。
有没有办法根据特定时区搜索年/月/日?