在我的Django应用程序中,我有一个带有一些日期和时间字段的Task
模型:
class Task(models.Model):
date = models.DateField()
start_time = models.TimeField(help_text='hh:mm')
end_time = models.TimeField(help_text='hh:mm')
# more stuff
我将向一些Android客户端发送一些Task
实例,这些客户端的时区(TZ1)与我的服务器时区(TZ2)不同。
start_time
和end_time
字段必须设置为目标时区(TZ1),也就是说,如果我在Task
管理员的start_time
字段中输入"13:00",则TZ1中应为"13:00"。
如何将start_time
和end_time
的值设置为TZ1次?如果我将输入的值保留在默认管理员中,我想时间将设置为服务器时区(TZ2),对吗?
那么,将这些值(通过JSON)发送到Android客户端以获得正确的TZ2时间的最佳格式是什么?
现在我使用Python Datetime的isoformat()
,它提供了类似的功能
2013-02-11T13:17:23.811680
但它没有时区数据。。。
这不是处理时区的最佳方式。
最好的方法是尽早将时间转换为UTC,并尽可能晚地将其转换回UTC。
换句话说,如果我在这里输入当前时间为Feb 11, 21:03
,它应该永远不会像那样存储。相反,它应该在发生任何其他事情之前更改为UTC。
所以,不管发生什么,它都是正确的。如果我把它发送到内蒙古,它应该一直保持UTC,直到有人想看它。然后,也只有到那时,它才应该被转换(并且仅用于显示)。
在任何必须跨多个时区工作的软件中,遵循这一规则都会为你省去很多悲伤。相信我,我们修复了一个主要的电信公司,因为他们实施了一些可怕的系统,通过电线发送时区,这意味着每个点都必须能够转换到每个时区。
让他们尽快进入UTC,并且只按需返回,节省了大量的时间和金钱。