在我们的应用程序中,我们在DataBase中保存UTC DateTime。客户端(javascript)在Local TimeZone中发送日期时间,在控制器级别,我们将其转换为UTC时间,然后在数据库中保存日期。
客户端和服务器都位于不同的时区。
我们从UTC使用实体框架
从数据库中获取日期DateTime.SpecifyKind(_CreatedDate, DateTimeKind.Utc);
所以我们应该再次将DateTime转换为控制器上的本地DateTime,还是应该在客户端处理所有DateTime转换逻辑。
答案 0 :(得分:5)
将DateTime
个实例发送到服务器时,转换应尽早转换为UTC。在这种情况下,客户端和客户端是javascript,您可以使用方法{ {3}}。如果您使用的是momentjs,可以使用toUTCString。
从服务器接收DateTime
个实例时,转换应尽可能晚地转换为本地时间。确保创建日期/检索日期为UTC格式。同样,客户端应该将它们转换为本地日期时间实例。
最后使用utc格式在客户端和服务器之间发送所有datetime实例。 Momentjs,javascript的日期对象,json.net都可以做到这一点。这样可以确保不会丢失任何内容,也不会引入文化特定的错误。
至于为什么它应该在客户端处理非常简单,最容易在那里做。只有客户真正知道它的时区,这通常很难准确猜测"在服务器端。不这样做的唯一原因是如果你想用他们的个人资料存储用户时区信息,但即使这样也会变得非常棘手(如果用户旅行或移动位置会发生什么情况等)。
至于如何持久化,您可以使用DateTime类型或带偏移类型的DateTime(真正的类型名称取决于您使用的RDBM)。您选择哪一个应该取决于在保存时知道偏离utc的重要性。到目前为止,我没有必要这样做,但也许这对你很重要。它对实际时间点没有影响,因为DateTime应该表示UTC时间点,而偏移量应该表示带有偏移的本地时间以回到UTC时间点。
答案 1 :(得分:1)
以下是我们在项目中的表现方式。在我看来,您应该在数据库中使用datetimeoffset
。这样,您就可以确定保存日期的时区。然后,当您将日期从客户端发送到服务器时,只需确保将其发送到datetimeoffset
。
当您将datetimeoffset
从服务器发送到客户端时,您可以在客户端进行转换。我认为没有人会认为MomentJS Timezone
是最好的图书馆。仔细看看并试一试。
在DateTimeOffset上详细说明
DateTimeOffset
是另一种数据类型,例如datetime,除了datetimeoffset添加一个小时偏移量来确定时区。例如,假设您在中央时区,并且希望节省时间08:00 am
。好吧,在Datetimeoffset中,它会像08:00:00:00 -04:00
那样声明偏移是-4(中心时区)。这很容易,因为在阅读它时你不需要做任何数学计算,而且你真的不需要进行任何转换(让MomentJS为你做这件事)。当你阅读它时,你总是会知道“哦,上午08:00是为了节省时间的人,看起来他们把它保存在中央时区。”
答案 2 :(得分:1)
由于非常相对 是“正确”转换时间。
我认为唯一有效的绝对规则就是这个。
UTC 时间是唯一真正有意义的数据
对任何时区的任何其他转换仅仅是“显示”
因此,请遵循与其他数据相同的规则。
就像在视图上将布尔值转换为复选框一样。或者将该复选框值作为布尔值发送到服务器。
这是最快的达到或离开 用户界面。