2013-04-03 83 views
1

服务器日期和服务器时候,我有一个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年4月3日12:00

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

总金额(分钟):25

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

感谢您的帮助:-)。

+1

_“现在我认为当用户改变他的时区时会出现一些问题”_ - 你为什么这么想? – CodeCaster

+0

是否需要在浏览器中显示日期和时间?是否足以显示像Stackoverflow这样的操作所用的时间量,例如他们表现出类似于:4分钟前问。 如果您仍然需要尊重客户端日期和时间格式,那么您可以从客户端HTTP请求获取本地化信息,然后在服务器上格式化信息。 – Siraf

+0

@CodeCaster因为日期保存在CEST中,并且用户有不同的时区,我错了? –

回答

0

来源:Determine a User's Timezone

你将不得不通过从客户端偏移到这样的服务器:)

new Date().getTimezoneOffset()/60; 

使用getTimezoneOffset(从GMT减去您的时间和返回 数分钟。因此,如果您住在格林威治标准时间8时,它将返回480.要将 这数小时除以60.此外,请注意标记 与您需要的相反 - 它计算GMT从您的 时区的偏移,而不是您的时区与GMT的偏移量。要解决这个问题,只需将 乘以-1。

0

由于这些都是事件发生的时间,您应该严格按照UTC工作,并从服务器获取该值。

当客户端应用程序调用你无论你使用开始停止输入命令,使用DateTime.UtcNow()获得的时间和保存在数据库中。

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

上下文对于DateTime问题总是很重要,在“事件时间”的上下文中,您唯一可靠的选项是UTC DateTime或DateTimeOffset。本地日历时间(客户端或服务器)不适合特定的活动时间。不过,它们在其他情况下很有用。当您真正向用户显示数据时,如果您只是显示开始和结束之间的持续时间,则可以根据您记录的UTC时间进行简单计算。如果您想要将具体时间显示回用户,那么您需要将UTC时间转换为用户想要显示的时区。如果选择DateTimeOffset,则优点是您不必转换在这个阶段。