存储DateTime(UTC)与存储DateTimeOffset

我通常有一个“拦截器”,即在从数据库读取/写入数据之前进行DateTime转换(从UTC到本地时间以及从本地时间到UTC),因此我可以使用DateTime.Now (派生和比较)系统而不用担心时区。

关于计算机之间的序列化和移动数据,不需要打扰,因为日期时间始终是UTC。

我应该继续以UTC格式存储日期(SQL 2008 - datetime)还是应该使用DateTimeOffset (SQL 2008 - datetimeoffset)存储日期?

数据库中的UTC日期(日期时间类型)一直在工作并且知道这么久,为什么要改变它? 有什么优势?

我已经看过这样的文章,但我不是100%相信。 有什么想法吗?


有一个巨大的差异,你不能单独使用UTC。

  • 如果你有这样的场景

  • 一台服务器几台客户机 (全部位于不同的时区
  • 客户使用日期时间信息创建一些数据
  • 客户将其全部存储在中央服务器上
  • 然后:

  • datetimeoffset存储UTC时间,并且还偏移到客户端的本地时间
  • 所有客户都知道所有数据的UTC时间以及信息发源地的当地时间
  • 但:

  • UTC日期时间仅存储UTC日期时间 ,因此您没有关于数据始发的客户端位置的本地时间的信息
  • 其他客户不知道该地点的当地时间,其中日期时间信息来自哪里
  • 其他客户端只能从数据库(使用UTC时间)计算其本地时间,而不是客户端的本地时间(数据源于此处)
  • 简单的例子是机票预订系统...机票应包含2次: - “起飞”时间(在“从”城市的时区) - “着陆”时间(在“目的地”城市的时区)


    DATETIMEOFFSET可让您将本地时间和UTC时间存储在一个字段中。

    这样可以在本地或UTC时间进行非常简单高效的报告,而无需以任何方式处理数据进行显示。

    这是两个最常见的要求 - 本地报告的本地时间和组报告的UTC时间。

    本地时间存储在DATETIMEOFFSET的DATETIME部分,UTC的OFFSET存储在OFFSET部分,因此转换过程非常简单,而且由于它不需要知道数据来自哪个时区,因此都可以在数据库级别完成。

    如果您不需要几毫秒的时间,例如只需几分钟或几秒钟,就可以使用DATETIMEOFFSET(0)。 DATETIMEOFFSET字段将只需要8个字节的存储空间 - 与DATETIME相同。

    因此,使用DATETIMEOFFSET而不是UTC DATETIME可为报告提供更多的灵活性,效率和简单性。


    在所有历史时间使用UTC是绝对正确的(即录制事件发生)。 从UTC到当地时间总是可能的,但并不总是相反。

    何时使用当地时间? 回答这个问题:

    如果政府突然决定改变夏令时,您是否希望这些数据随之改变?

    只有当答案是“是”时才存储当地时间。 显然这只会在将来的日期,通常只会在某些方面影响到人的日期。

    为什么要存储时区/偏移量?

    首先,如果您想记录执行该操作的用户的偏移量,那么您最好只是这样做,即在登录时记录该用户的位置和时区。

    其次,如果要转换为显示,则需要为该时区提供所有本地时间偏移转换的表格,只需知道当前偏移量是不够的,因为如果您显示的是六个月前的日期/时间,则偏移量将会不一样。

    链接地址: http://www.djcxy.com/p/46555.html

    上一篇: Storing DateTime (UTC) vs. storing DateTimeOffset

    下一篇: When Would You Prefer DateTime Over DateTimeOffset