3

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

但是,然后我点击了那些说它不是那么简单的文章,您需要考虑“即时”并且由于使用或使用不安全而将用户输入DateTime转换为困难,或者您可以让发布和使用来显示当地时间但是如果我有一个模型属性的视图怎么办?即使依靠显然也不能被认为是安全的。UTCTimeZone IdToUniversalTime()JavaScriptUTC DateTimeJSRazorDateTimeToLocalTime()

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

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

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

看来无知是福。

更新:例如,用户有一个来自 jQuery 的 DateTimePicker,他们选择了一个事件的日期时间。该应用程序的用户是全球性的,因此如果他们选择美国东部时间上午 10 点,英国用户的视图中应该显示为下午 6 点。

4

2 回答 2

1

让我们看看我们拥有的所有技术: SQL Server(我认为您使用 SQL Server,因为 MS Stack) - DATETIME类型不存储时区偏移范围,因此除了保留它们之外,这并没有给我们提供其他选择在UTC。

.NET 为您提供了使用 DateTime 类型的时区进行操作的选项。因此,您可以从数据库加载值并以某种方式将其更改为用户时区。这是个好问题,如何确定用户时区是什么?好的,所以如果用户注册了大小 - 您可以使用“您的时区”之类的设置并将其存储给所有用户(站点的一个分支执行此操作,例如 Sharepoint),因此每次渲染视图时 - 您都使用此设置和使用正确的时区渲染视图。这样做的问题可能是,如果您需要使用缓存 - 您将需要根据用户时区进行缓存(不是最好的,呵呵)...

但是,如果您有一些匿名用户并且您没有关于他的信息怎么办?

让我们看一下JavaScript。JavaScript 允许您使用时区进行操作。您可以在服务器上将所有与日期相关的字符串呈现为<date>2013-04-08T12:00:00Z</date>,这表明该日期为 UTC,之后onload您可以启动 JS 代码,该代码将date在视图中找到所有标签并将它们转换为浏览器时区。(我有一篇关于这个问题的文章Developing web application with time zone support,它有很多语法错误,很抱歉)。

所以,对我来说 - 正确的方法是将所有内容保持在 UTC 中,直到您不会向用户显示它。只有 View 应该使用用户时区中的日期进行操作(在您的情况下,这应该只是 JavaScript 层),每次您需要将带有日期的数据发送到服务器时 - 您需要将此日期转换为 UTC。每次从服务器获取日期 - 首先将它们转换为浏览器时区,然后将其显示给用户。

于 2013-04-08T21:05:31.400 回答
1

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

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

除此之外,我可以将任何日期/时间转换为本地时间或 UTC 时间。现在,如果您需要从 javascript 而不是从 C# 执行此操作,我使用MomentJsMomentJs 可以使用UTC 函数在 UTC 和本地时间之间进行转换。

我希望这可以帮助你

于 2013-04-08T21:22:41.923 回答