pythonDjango和datetime感知对象

2024-09-26 17:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django模型model.datetime字段作为属性。因为用户必须能够单独添加时间和日期,而且我希望能够完全自定义在模板中呈现的日期和时间输入,所以我做了以下操作

class Entry(models.Model):
    title = models.CharField(max_length=40)
    body = models.CharField(max_length=10000, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    start_date = models.DateField(default=datetime.now().date())
    start_hour = models.TimeField(default=datetime.now().time())
    start = models.DateTimeField()
    end_hour = models.TimeField(default=(datetime.now()+ timedelta(minutes=45)).time())
    end = models.DateTimeField()

形式

^{pr2}$

因此,在save方法中,我创建了一个新的date-time对象,它结合了start date和start hour

问题是当你把它们呈现在表单上进行编辑时。因为输入日期以utc格式存储,开始时间和结束时间不是我从表格中保存它们的确切时间,而是晚了3个小时(因为我住在希腊,我的设置文件中有时区=雅典)。在

有没有解决这个问题的简单方法呢?还是不使用感知对象的解决方案呢?在

还有一点离题。Javascript知道时区偏移量。我知道

x = new Date();
x.getTimeZoneOffset() / 60; 

我得到-3,这是正确的。如果我在我的Ubuntu系统中更改我的时区,我的Ubuntu时钟会改变以匹配所选时区的时间,但是上面的javascript代码返回相同的结果。所以javascript不会使用系统时区?在


Tags: truedefaultdatetimedatetimemodels时间start
1条回答
网友
1楼 · 发布于 2024-09-26 17:42:17

它不能直接解决您的时区问题,但您不应该在模型中这样做:

start_date = models.DateField(default=datetime.now().date())
start_hour = models.TimeField(default=datetime.now().time())
start = models.DateTimeField()

您已经用冗余字段污染了数据模型,只是为了更改UI—进行此更改的适当位置是关联的ModelForm(和模板)

Django为此提供了https://docs.djangoproject.com/en/dev/ref/forms/widgets/#splitdatetimewidget。在

对你来说时区问题。。。如果您在设置中有USE_TZ = True,那么Django将根据您的设置假设来自用户输入的所有日期和时间都在TIME_ZONE = 'Athens'中。。。然后,在保存到数据库之前,它会将这些转换为UTC(检索时会将它们转换回雅典时间)。
https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-USE_TZ

如果您需要处理用户在不同时区提交的数据时间信息,那么设置USE_TZ = False可能会更容易些……您的datetimes将不再包含时区信息,因此您应该将Django应用程序之外的所有内容规范化为UTC(即在javascript中)

我不确定您关于getTimeZoneOffset的问题的答案-可能您需要重新启动您的浏览器,然后它将更改为系统时区?在

相关问题 更多 >

    热门问题