在客户端显示服务器日期和服务器时间



我有一个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

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

TimerId: 1

开始时间:04/03/2013 12:00

Stop: 04/03/2013 12:25

总数(以分钟计):25

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

谢谢你的帮助:-).

From: decide a User's Timezone

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

new Date().getTimezoneOffset()/60;

getTimezoneOffset()将从GMT中减去您的时间并返回分钟数。所以如果你生活在GMT-8中,它将返回480。把这是小时数,除以60。另外,注意符号是与你需要的相反——它计算GMT与你的时区,而不是您的时区与GMT的偏移量。要解决这个问题,很简单乘以-1

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

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

您根本不想使用本地时间来记录这些时间。否则,如果开始或结束落在一个模糊的时间段内(例如DST/SummerTime"回退"转换),您将无法知道事件是在转换之前还是之后发生的。

上下文总是与DateTime问题有关,在"事件时间"的上下文中-您唯一可靠的选项是UTC DateTime或DateTimeOffset。本地日历时间(客户机或服务器)不适用于特定的事件时间。不过,它们在其他上下文中也很有用。

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

相关内容

  • 没有找到相关文章

最新更新