【问题标题】:Displaying server date and server time on client在客户端显示服务器日期和服务器时间
【发布时间】:2013-03-24 23:52:27
【问题描述】:

我有一个 C# 时间应用程序,用户可以在其中创建一个计时器并启动它,它会在服务器上执行类似的操作:

(日期存储在 CEST 中(问题是夏季和冬季时间))

// insert into db
var entry = new TimeEntry();
entry.Start = DateTime.Now; (04/03/2013 12:00)

_timeEntries.Add(entry);    // => now it's in the db

如果他停止它,那么它会做类似的事情:

// update the entry
var entry = _timeEntries.Get(1)    // 1 is the id from the created entry before
entry.End = DateTime.Now; (04/03/2013 12:37)

_timeEntrires.Update(entry);    // => now it updates it in the db

将在浏览器中为用户显示类似的内容:

定时器 ID:1

开始:04/03/2013 12:00

停止:04/03/2013 12:25

总计(以分钟计):25

现在我认为当用户更改他的时区时会出现一些问题。 解决这个问题的最佳方法是什么?将日期存储为 UTC,然后使用 JavaScript 进行转换?

感谢您的帮助:-)。

【问题讨论】:

  • “现在我认为当用户更改他的时区时会出现一些问题” - 你为什么这么认为?
  • 是否需要在浏览器中显示日期和时间?是否足以显示用于诸如 Stackoverflow 之类的操作的时间量,例如他们显示类似: 4 分钟前问。如果您仍然需要尊重客户端日期和时间格式,那么您可以从客户端 HTTP 请求中获取本地化信息,然后在服务器上格式化信息。
  • @CodeCaster 因为日期保存在 CEST 并且用户有不同的时区,我错了吗?
  • 是的,您确定服务器上的日期。客户端的设置无关紧要。

标签: c# javascript asp.net-mvc date timezone


【解决方案1】:

发件人:Determine a User's Timezone

您必须像这样将偏移量从客户端传递到服务器:

new Date().getTimezoneOffset()/60;

getTimezoneOffset() 将从 GMT 减去您的时间并返回 分钟数。因此,如果您居住在 GMT-8,它将返回 480。 以小时为单位,除以 60。另外,请注意符号是 与您需要的相反-它正在计算 GMT 与您的偏移量 时区,而不是您的时区与 GMT 的偏移量。要解决此问题,只需 乘以 -1。

【讨论】:

    【解决方案2】:

    由于这些是事件时间,您应该严格使用 UTC,并从服务器获取该值。

    当客户端应用程序调用您使用的任何startstop 输入命令时,使用DateTime.UtcNow() 获取时间并将其保存在数据库中.

    您真的不想使用当地时间来记录这些时间。否则,如果开始或结束位于不明确的时期内(例如 DST/SummerTime“回退”转换),您将无法知道事件是在转换之前还是之后发生的。

    上下文对于 DateTime 问题总是很重要,并且在“事件时间”的上下文中 - 您唯一可靠的选项是 UTC DateTime 或 DateTimeOffset。本地日历时间(客户端或服务器)不适用于特定事件时间。不过,它们在其他情况下也很有用。

    当您实际向用户显示数据时,如果您只是显示开始和结束之间的持续时间,那么您可以简单地根据您记录的 UTC 时间计算它。如果您想将特定时间显示给用户,那么您可以将 UTC 时间转换为用户想要显示它的任何时区。如果您选择 DateTimeOffset,优点是您不必转换在这个阶段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多