【问题标题】:One hour less when saving django datetimefield保存 django datetimefield 时减少一小时
【发布时间】: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


【解决方案1】:

看起来问题出在日历插件 (FullCalendar) 上,而不是整个应用程序。我意识到 FullCalendar 有一个时区选项,该选项设置为 false。将其设置为“本地”,日期时间将正确显示在网站中。

无论如何,谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2022-08-14
    • 2011-02-02
    • 2018-04-18
    • 2013-03-06
    相关资源
    最近更新 更多