一般来说,您应该以UTC格式处理所有日期时间,因为这些都是绝对时间戳,总是正确的。即使你只打算让EST时区的用户使用你的网站,EST时区在夏天有夏令时(DST),所以当时间跳跃时,你可能会出现错误行为(特别是当时钟倒转时有一个小时的重叠)。这意味着:
-
您的代码应该使用UTC时间戳进行计算并传递
-
您的数据库应该存储UTC日期时间(PostgreSQL也会这样做)。
向用户显示数据时,应仅转换为本地时区。这是Django的默认行为:
-
USE_TZ = True
默认情况下
-
TIME_ZONE = "America/New_York"
设置默认时区,将考虑DST
因此,当您将一个具有时间意识的日期时间保存到数据库时(以EST为单位),数据库将其存储为UTC。当您获取并显示它时,Django将在用户的当前时区(在您的情况下是EST)中显示它。当您直接使用工具查询数据库时,PostgreSQL会返回UTC,正确的日期时间,但是您的shell或工具可能会在本地时区中显示它。您可以使用另一个答案中@c.grey发布的链接将查询格式化为使用不同的时区。
详细阅读
here