从服务器到客户端的UTC偏移量
本文关键字:UTC 偏移量 客户端 服务器 | 更新日期: 2023-09-27 18:12:40
在我们的应用程序中,我们在数据库中保存UTC日期时间。客户端(javascript)正在发送本地时区的日期时间,在控制器级别,我们将其转换为UTC时间,然后将日期保存在数据库中。
客户端和服务器都在不同的时区。
我们正在使用实体框架从UTC数据库中获取日期
DateTime.SpecifyKind(_CreatedDate, DateTimeKind.Utc);
那么我们应该再次在控制器上将DateTime转换为本地DateTime,还是应该在客户端处理所有的DateTime转换逻辑。
当向服务器发送DateTime
实例时,应尽早进行到UTC的转换。在这种情况下,客户端和你的客户端是javascript,你可以使用方法toUTCString。如果你使用的是momentjs,你可以使用utc。
当从服务器接收DateTime
实例时,转换到本地时间的转换应该尽可能晚。确保在创建持久化日期/检索日期时使用UTC。同样,应该是客户端将它们转换为本地日期时间实例。
最后使用ISO8601格式在客户端和服务器之间发送所有日期时间实例。Momentjs, javascript的date对象,json.net都可以做到这一点。这可以确保没有任何丢失,也不会引入特定于文化的错误。
至于为什么要在客户端处理,这很简单,在客户端处理最容易。只有客户端真正知道自己的时区,这通常很难在服务器端"准确猜测"。不这样做的唯一原因是,如果您想将用户的时区信息与他们的配置文件一起存储,但即使这样也会变得非常棘手(如果用户旅行或如果他们移动位置等会发生什么)。
至于如何持久化,您可以使用DateTime类型或带偏移类型的DateTime(真正的类型名称取决于您正在使用的RDBMs)。选择哪一个应该取决于在保存时知道与utc的偏移量是否重要。到目前为止,我还没有必要这样做,但也许这对你很重要。它对实际的时间点没有影响,因为DateTime应该代表UTC时间点,而带偏移的应该代表本地时间,带偏移的应该回到UTC时间点。
我们在项目中是这样做的。在我看来,您应该在数据库中使用datetimeoffset
。这使您能够识别保存日期的时区。然后,当你把你的日期从你的客户端发送到你的服务器,只要确保它在datetimeoffset
发送。
当您将datetimeoffset
从服务器发送到客户端时,您可以在客户端进行转换。我认为没有人会说MomentJS Timezone
是最好的库。看一看,试一试。
说明DateTimeOffset
DateTimeOffset
是与datetime类似的另一个数据类型,只是datetimeoffset增加了一个小时偏移量来确定时区。例如,假设您在中央时区,并且希望将时间保存为08:00 am
。那么,在Datetimeoffset中,它将类似于08:00:00:00 -04:00
声明偏移量为-4(中央时区)。这使得它很容易,因为你不需要做任何数学在你的头脑中阅读它,你真的不需要做任何转换(让MomentJS为你做)。当你读到它的时候,你总是会知道"哦,对于那些节省时间的人来说,现在是上午8点,而且看起来他们把时间保存在了中央时区。"
由于何时是转换的"适当"时间是相当相对的。
我认为唯一有效的绝对规则是这一条。
UTC时间是唯一的真正有意义的数据
任何其他转换到任何时区只是一个"显示"对我来说
所以请遵循与处理其他数据相同的规则。
就像在视图中将一个布尔值转换为一个复选框。或者将复选框值作为布尔值发送给服务器。
决出的到或叶的 UI 。