【发布时间】:2015-01-31 22:56:38
【问题描述】:
保存以下模型时,开始日期时间比我的本地时间少一小时。我设置了USE_TZ = True 和TIME_ZONE = "Europe/Madrid"。我想减少一小时是因为它被称为 UTC(比欧洲/马德里少一小时)。 MySQL 也存储了错误的日期时间。但是,我需要在我的网站上显示正确的日期时间。管理员中的日期时间是正确的,但在应用程序的其余部分中则不正确。
我尝试了几种方法来实现日期时间,但我无法得到它。这是我的实际代码,分配给开始字段:
pytz.timezone("Europe/Madrid").localize(datetime.datetime.now()).strftime("%Y-%m-%dT%H:%M:%S")
当我执行上一条指令时,我得到了正确的日期print,但保存后,它的存储时间减少了一个小时。为什么?
这是我的模型:
class Event(models.Model):
title = models.CharField(max_length=40)
start = models.DateTimeField(null=True,blank=True)
end = models.DateTimeField(null=True,blank=True)
allday = models.BooleanField(default=False)
user = models.ForeignKey(User)
编辑-1:
AJAX 调用:
$.ajax({
type: "GET",
url: "/projects/{{project.id}}/get_events/",
dataType: "json",
success: function(response){
data = eval("(" + response + ")")
var events = [];
for(i=0;i<data.length;i++){
events.push({
id: data[i].pk,
title: data[i].fields['title'],
start: data[i].fields['start'],
end: data[i].fields['end'],
className: "event",
defaultTimedEventDuration: "00:30:00"
});
}
}
});
【问题讨论】:
-
你读过timezone documentation吗?日期时间以 UTC 格式存储,因为感知日期时间始终以 UTC 格式存储。但是,向用户显示的时区基于当前时区,默认情况下为
TIME_ZONE时区。这就是您在管理员中获得正确价值的原因。请定义“应用程序的其余部分”,以便清楚地知道您在哪里得到了错误的值。 -
“应用程序的其余部分”是指网站。我有一个日历插件,其中显示的每个事件都少了一小时(UTC 日期时间)。如何引用本地时间或当前时区而不是存储在 UTC 中的日期时间?
-
我通过 AJAX 调用获取所有日历事件,使用简单的 'events = Event.objects.filter(user=user)' 查询事件并序列化它们 'data = serializers.serialize ('json',事件)'。我将 AJAX 调用放在帖子的编辑部分。
-
看起来 Django 在序列化之前没有将
datetimes转换为当前时区。我可以想到几个选项:1)如果您只关心您的本地时区,您可以将USE_TZ设置为False。 2)您可以自定义序列化(无论是在Django本身还是在上述框架之一中)以在序列化之前转换值。 3)您可以在客户端用javascript进行转换。 -
你的设置中有
USE_TZ = True吗?
标签: django datetime timezone fullcalendar pytz