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

C# 在客户端上显示服务器日期和服务器时间,c#,javascript,asp.net-mvc,date,timezone,C#,Javascript,Asp.net Mvc,Date,Timezone,我有一个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

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

开始时间:2013年3月4日12:00

停止时间:2013年3月4日12:25

分钟总数:25

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

感谢您的帮助:-.

来自:

您必须将偏移量从客户端传递到服务器,如下所示:

new Date().getTimezoneOffset()/60;
getTimezoneOffset将从GMT中减去您的时间并返回 分钟数。所以,如果你住在GMT-8,它将返回480。放置 这个除以小时,除以60。另外,请注意,该标志是 与您需要的相反-它计算GMT的偏移量 时区,而不是您的时区与GMT的偏移量。要解决此问题,只需 乘以-1


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

当客户机应用程序调用启动和停止输入命令时,请使用DateTime.UtcNow获取时间并将其保存在数据库中

你真的不想用当地时间来记录这些时间。否则,如果开始或结束在不明确的时间段内,例如DST/夏季回退过渡,则无法知道事件是在过渡之前还是之后发生的

上下文始终与日期时间问题有关,在事件时间上下文中,唯一可靠的选项是UTC日期时间或。客户端或服务器的本地日历时间不适用于特定事件时间。不过,它们在其他情况下也很有用


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

现在,我认为当用户更改时区时会出现一些问题-您认为这是为什么?是否有必要在浏览器中显示日期和时间?它是否足以像Stackoverflow那样显示操作所用的时间量?是否足够?例如,他们显示的内容如下:4分钟前询问。如果您仍然需要遵守客户端日期和时间格式,则可以从客户端HTTP请求中获取本地化信息,然后在服务器上格式化信息。@CodeCaster因为日期保存在CEST中,并且用户有不同的时区,所以我错了?是的,您确定了服务器上的日期。客户端的设置并不重要。