【问题标题】:Django: Dates don't change correctly when changing TimezoneDjango:更改时区时日期未正确更改
【发布时间】:2021-06-08 06:07:09
【问题描述】:

当我在我的 django 项目中更改时区时,日期确实会正确更改。当时区设置为“UTC”时,日期显示如下:

这是正确的。如您所见,这些也是我的数据库中指定的日期:

但是当我将设置更改为:

LANGUAGE_CODE = 'nl'
TIME_ZONE = 'Europe/Amsterdam'
USE_I18N = True
USE_L10N = True
USE_TZ = True

我的应用程序中的日期现在更改为下图。只有前两个日期以正确的方式显示,尽管除了时区没有任何变化。

有谁知道为什么会发生这种情况,我该如何解决?

编辑:代码

def afspraak_maken(request):    
    form = EventForm(request.POST or None)
    if request.POST and form.is_valid():
        title = form.cleaned_data['title']
        soort = form.cleaned_data['soort']
        description = form.cleaned_data['description']
        start_time = form.cleaned_data['start_time']
            
        Event.objects.get_or_create(
            user=request.user,
            title=title,
            soort=soort,
            description=description,
            start_time=start_time,
            time_set = time_set
        )
            
        Timing.objects.get_or_create(
                event_id=find_id,
                name= 1,
                start_time=localtime(start_time),
                end_time=localtime(start_time) + timedelta(hours=1, minutes=30)
            )

        Timing.objects.get_or_create(
            event_id=find_id,
            name= 2,
            start_time=  localtime(start_time) + timedelta(days=7),
            end_time= localtime(start_time) + timedelta(days=7,hours=1, minutes=30)
            
        )

        Timing.objects.get_or_create(
            event_id=find_id,
            name= 3,
            start_time=localtime(start_time) + timedelta(days=21),
            end_time=localtime(start_time) + timedelta(days=21,hours=1, minutes=30)
        )
        return redirect('afspraak_bewerken', pk=find_id)

    return render(request, 'kalender/afspraak_maken.html', {'form': form})
                       

我的计时模型:

class Timing(models.Model):
     event = models.ForeignKey(Event, null=True, on_delete=models.CASCADE)
     name = models.CharField(max_length=200)
     start_time = models.DateTimeField()
     end_time = models.DateTimeField()
     comment = models.CharField(max_length=300,null=True, blank=True)

我显示日期的表格之一

<table class="homepage-table mt-2 mb-2" id="myTable2">
      <tr>
        <th> Afspraak</th>
        <th> Training</th>
        <th> Start tijd</th>
        <th> Eind tijd</th>
        <th> Locatie</th>
        <th> Trainer</th>
      </tr>

      {% for timing in timing%}
      <tr>

        <td> {{timing.name}}</td>
        <td> {{timing.event.title}}</td>
        <td> {{timing.start_time|date:'d-m-Y H:i'}}</td>
        <td> {{timing.end_time|date:'d-m-Y H:i'}}</td>
        <td> {{timing.event.locatie}}</td>
        <td> {{timing.event.trainer}}</td>
       
      </tr>
      {% endfor%}
    </table>

【问题讨论】:

    标签: python django postgresql timezone


    【解决方案1】:

    您的显示器没有问题。但是在 2021 年 3 月 28 日的荷兰,时间发生了变化,这就是为什么 2 第一个似乎“在好时机”,而不是其他的。

    所以 20-03-2021, 11:00 UTC = 20-03-2021 12:00 in NL (UTC+1) 但是 04-04-2021, 11:00 UTC = 04-04-2021 13:00 in NL (UTC+2)

    你可以试试这个:

    from django.utils.timezone import localtime
    
    new_start_date = localtime(start_date) + timedelta(days=7)
    

    【讨论】:

    • 感谢您指出这一点。我永远不会得出这样的结论。所以我的问题是,当 UTC 差异为 +1 时,它将 UTC 日期发送到数据库,但由于我设置的日期是 3 月 28 日之后,它返回 +2。您知道如何确保我看到当前时间转换中的所有日期,而不是未来时间转换中的所有日期吗?
    • 问题是您在保存数据后更改了时区。如果您在保存数据时拥有良好的 TZ,它将根据需要显示。现在最好的办法是删除这些条目,然后使用您在设置中设置的 TZ 重新创建它们,而不是再次更改它
    • 它仍然为新项目执行此操作。我认为问题在于我尝试使用 timedelta(days=7) 将 7 天添加到我的日期。由于 DST,7 天后日期确实会晚一个小时,但这不是我想要显示的。
    • 哦,好吧,你就是这样添加的,事实上你可能使用了一个幼稚的增量。所以尝试使用时区一:timezone.now() + timezone.timedelta(days=7)
    • 这仍然增加了小时数。理想情况下,会有一个解决方案确保数据库中的 UTC 时间在 DST 之后设置为少一小时。但这似乎没有发生......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多