我通常有一个“拦截器”,它在读/写数据库之前执行DateTime转换(从UTC到本地时间,从本地时间到UTC),所以我可以在整个系统中使用DateTime.Now
(派生和比较),而不用担心时区。
关于序列化和在计算机之间移动数据,没有必要费心,因为日期时间总是UTC。
我应该继续以UTC格式存储我的日期(SQL2008- datetime),还是应该使用DateTimeOffset
(SQL2008- datetimeoffset)存储它?
数据库中的UTC日期(datetime类型)已经工作并知道了这么长时间,为什么要更改它?其优势是什么?
我已经看过像this one这样的文章了,但我并不是百分之百地相信。有什么想法吗?
发布于 2012-02-16 16:18:33
有一个巨大的不同之处,那就是你不能单独使用UTC。
的场景
- **One server** and **several clients** (all **geographically in different timezones**)
- Clients create some data with datetime information
- Clients store it all on central server
- **datetimeoffset stores Local time of the client and ALSO offset** to the UTC time
- all clients know UTC time of all data and also a local time in the place where the information originated
- **UTC datetime stores just UTC datetime**, so you do not have information about local time in the client location where data originated
- Other clients do not know the local time of the place, where datetime information came from
- Other clients can only calculate their local time from the database (using UTC time) not the local time of the client, where the data originated
一个简单的例子就是机票预订系统。机票需包含2次:-“起飞”时间(“始发地”城市时区)-“降落”时间(“目的地”城市时区)
发布于 2011-03-10 19:00:23
对于所有历史时间(即记录发生的事件),使用UTC是绝对正确的。从UTC到本地时间总是有可能的,但并不总是相反。
什么时候使用本地时间?回答这个问题:
如果政府突然决定更改夏令时,您是否希望此数据也随之更改?
如果答案是“是”,则只存储本地时间。显然,这只适用于未来的日期,而且通常只适用于以某种方式影响人们的日期。
为什么要存储时区/偏移量?
首先,如果您想记录执行操作的用户的偏移量,您可能最好这样做,即在登录时记录该用户的位置和时区。
其次,如果您希望转换为显示,则需要有一个表,其中包含该时区的所有本地时间偏移量转换,仅知道当前偏移量是不够的,因为如果显示六个月前的日期/时间,则偏移量将不同。
发布于 2013-06-08 17:35:00
DATETIMEOFFSET使您能够在一个字段中存储本地时间和UTC时间。
这允许以当地或UTC时间进行非常简单和有效的报告,而无需以任何方式处理要显示的数据。
这是两个最常见的要求-本地报告的本地时间和组报告的UTC时间。
本地时间存储在DATETIMEOFFSET的DATETIME部分中,与UTC的偏移量存储在偏移量部分中,因此转换很简单,并且由于它不需要数据来自哪个时区的知识,因此都可以在数据库级完成。
如果您不需要时间降至毫秒,例如,仅降至分钟或秒,则可以使用DATETIMEOFFSET(0)。DATETIMEOFFSET字段将只需要8字节的存储空间-与日期时间相同。
因此,使用DATETIMEOFFSET而不是UTC DATETIME可以为报告提供更多的灵活性、效率和简单性。
https://stackoverflow.com/questions/4715620
复制