在.net中存储和显示日期时间的正确方法是什么?

本文关键字:方法 是什么 时间 日期 net 存储 显示 | 更新日期: 2023-09-27 18:08:11

我想我可能已经在一个洞穴里生活了一段时间,因为DateTime的复杂性直到今天才被淹没。我读过一些文章,建议始终将DateTime存储为数据库中的UTC,然后将它们显示为视图中的本地时间。

然而,我然后击中文章,说它不是那么简单,你需要考虑"瞬间"和转换用户输入的DateTimeUTC是困难的,由于TimeZone Id或使用ToUniversalTime()是不安全的,或者你可以让JavaScript发布UTC DateTime和使用JS来显示当地时间,但如果我有一个Razor视图与DateTime模型属性?即使依靠ToLocalTime()显然也不能被认为是安全的。

我从Jon Skeet那里听说了Noda Time,我希望它能解决所有这些问题,尽管我知道他已经评论说它并不完美。

那么,在.Net中,人们到底在使用什么,即使是非常简单的web应用程序?

是否有一个正确的例子,你可以提供或链接到哪些帖子,然后呈现的值是时区同情?

看来无知是福。

UPDATE:例如,用户有一个来自jQuery的DateTimePicker,他们选择一个事件的日期时间。该应用程序的用户是全球性的,所以如果他们选择美国东部时间上午10点,那么对于英国用户来说,视图应该显示为下午6点。

在.net中存储和显示日期时间的正确方法是什么?

让我们看看我们拥有的所有技术:SQL Server(我认为你使用SQL Server,因为MS Stack) - DATETIME类型不存储时区偏移范围,所以这并没有给我们其他的选择,而只是保持它们在UTC。

。NET为您提供了一个选项来操作DateTime类型中的时区。因此,您可以从数据库加载值,并以某种方式将其更改为用户时区。这是一个好问题,如何确定用户的时区是什么?好的,如果用户注册了这个大小-你可以使用'Your timezone'这样的设置,并为所有用户存储它(一个分支网站这样做,像Sharepoint),所以每次你渲染视图-你使用这个设置和渲染视图正确的时区。这样做的问题是,如果你需要使用缓存——你需要根据用户的时区进行缓存(不是最好的,嗯)……

但是如果你有一个匿名用户而你没有他的信息怎么办?

让我们来看看JavaScript。JavaScript允许您操作时区。你可以将服务器上所有与日期相关的字符串呈现为<date>2013-04-08T12:00:00Z</date>,这表示UTC的日期,在此onload之后,你可以启动JS代码,它将在视图中找到所有date标签并将它们转换为浏览器时区。(我有一篇关于这个问题的文章,开发具有时区支持的web应用程序,它有很多语法错误,抱歉)。

所以,对我来说,正确的方法是保持一切在UTC,直到你不会显示给用户。只有视图应该在用户时区操作日期(在你的情况下,这应该只是JavaScript层),每次你需要发送数据与日期到服务器-你需要将这个日期转换为UTC。每次从服务器获取日期-首先将它们转换为浏览器时区,然后显示给用户。

我可以告诉你我是怎么做的。net有一个叫做Kind的属性。我在数据库中有一个名为UserTimeZome的字符串字段在用户设置中,用户可以设置他或她的时区。您可以使用此代码枚举下拉列表。

一旦用户选择了他或她的时区,我将DisplayName存储在数据库的UserTimeZone字段中。现在我有能力将UTC时间转换为他们的当地时区,反之亦然。我可以使用converttimeoutc方法或ConvertTimeFromUtc方法。请确保通过创建新的DateTime并在DateTime构造函数上设置Kind来更新Kind属性。

与此同时,我可以将任何日期/时间转换为本地时间或UTC时间。现在,如果你需要从javascript,而不是从c#,我使用MomentJs。MomentJs可以使用UTC函数在UTC和本地时间之间进行转换。

我希望这对你有帮助