我timestamptz在PostgreSQL中有一个时区感知字段.当我从表中提取数据时,我想立即减去时间,以便我可以得到它的年龄.
我遇到的问题是,无论是datetime.datetime.now()和datetime.datetime.utcnow()似乎回到时区不知道时间戳,这导致我得到这个错误:
TypeError: can't subtract offset-naive and offset-aware datetimes
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种情况(最好不使用第三方模块).
编辑:感谢您的建议,但是尝试调整时区似乎给了我错误..所以我只是在PG中使用时区不知道的时间戳并始终使用:
NOW() AT TIME ZONE 'UTC'
Run Code Online (Sandbox Code Playgroud)
这样我的所有时间戳都默认为UTC(尽管这样做更烦人).
我正在将应用程序从django 1.2迁移到1.4.
我有一个每日任务对象,其中包含应该完成任务的时间:
class DailyTask(models.Model):
time = models.TimeField()
last_completed = models.DateTimeField()
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
weekends = models.BooleanField()
def __unicode__(self):
return '%s' % (self.name)
class Meta:
db_table = u'dailytask'
ordering = ['name']
Run Code Online (Sandbox Code Playgroud)
为了检查今天是否仍需要完成任务,我有以下代码:
def getDueDailyTasks():
dueDailyTasks=[]
now = datetime.datetime.now()
try:
dailyTasks = DailyTask.objects.all()
except dailyTask.DoesNotExist:
return None
for dailyTask in dailyTasks:
timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second)
if timeDue<now and timeDue>dailyTask.last_completed:
if dailyTask.weekends==False and now.weekday()>4:
pass
else:
dueDailyTasks.append({'id':dailyTask.id,
'due':timeDue,
'name': dailyTask.name,
'description':dailyTask.description})
return dueDailyTasks
Run Code Online (Sandbox Code Playgroud)
这在1.2下工作正常,但在1.4以下我得到错误:
can't compare offset-naive and offset-aware datetimes …Run Code Online (Sandbox Code Playgroud) 我正在使用Django 1.11。我settings.py已配置以下内容:
TIME_ZONE = 'Asia/Calcutta'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
这是IST(印度标准时间)。我的系统设置为IST。MySQL current_time返回IST(运行时Django的服务器),并在IST中显示时间戳。Python datetime.now()也提供IST。
现在的问题是,我models.py有以下几个字段:
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
数据库是MySQL。当我在其中插入任何记录时,时间戳记为UTC。我正在考虑根据此答案的建议添加一些中间件,但这并不是推荐的方法。即使已配置了所有IST,为什么还要采用UTC?我是否缺少一些需要为模型单独设置的配置?
请注意,这个问题与我所要求的不同。我想更改整个时区,以便它在模型中也有效。
我有以下两个日期/时间,分别是date_time1和date_time2:
2017-04-15 00:00:00
2017-04-17 15:35:19+00:00
parsed1 = dateutil.parser.parse(date_time1)
parsed2 = dateutil.parser.parse(date_time2)
Run Code Online (Sandbox Code Playgroud)
如果我收到另一个日期/时间input_date_time(例如 2017-04-16 12:11:42+00:00),我想做以下事情:
# Would like to check if `input_date_time` is within the range
if parsed1 <= input_date_time <= parsed2:
…
Run Code Online (Sandbox Code Playgroud)
并得到一个错误: TypeError: can't compare offset-naive and offset-aware datetimes
想把它分解成年、月、日、小时、分钟和秒,然后比较每一个。
这样做的正确方法是什么?
在Django 的文档中是以下代码片段
from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
Run Code Online (Sandbox Code Playgroud)
Pycharm亮点self.pub_date和喊话
预期类型为“timedelta”,但得到“DateTimeField”
我该如何摆脱这个并做正确的事情?