2014-06-12 19 views
0

我在C#(服务器)侧以此方法:不正确的时区为Javascript

protected double GetAccountTime() 
{ 
    return ((DateTime)unit.SomeMethod(DateTime.UtcNow)) 
      .Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)) 
      .TotalMilliseconds; 
} 

我的本地机器时间是东方的,但我的应用程序的账户时间是山。所以我想把它改成东方到山区的时间。 unit.SomeMethod(...)只需要当前的当地时间(东部)并将其转换为帐户时间(山)。

在JavaScript方面:

var now = new Date(<%=GetAccountTime()%>); 
alert(now);//doesn't consider the time to be UTC, need to convert 
var now_utc = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds()); 
alert("UTC: " + now_utc); 

第一个提醒语句给我Thu Jun 12 2014 09:30:42 GMT-0400 (Eastern Standard Time)这是不正确。我将时间转换为UTC,因此第二条警报声明给我UTC: Thu Jun 12 2014 13:30:42 GMT-0400 (Eastern Standard Time)。就时间而言,这是正确的,但时区仍然是东区。有人问我为什么,如何解决这个问题?

我的应用程序的功能(在@JonSkeet的要求):

  • 将获得的帐户时间不同记录的片段(在不同的位置有可能)的时间。
  • 将会有一个类似时间线的游标,它需要帐户时间(不是当地时间)。
  • 会有选项将时间发送回服务器端,所以知道正确的偏移量将使这更容易。

回答

3

A Date对象没有任何时区概念。它始终是表示自Unix纪元以来的毫秒数。

你不需要做任何转换 - 你有正确的时间点。 (事实上​​,有没有意义,你可以时区之间有Date转换,因为它只是一个时间点。)

如果你关心字符串表示,你可以调用toUTCString()toString()函数将始终使用系统本地时间。

例如,在Chrome控制台:

> var now = new Date(); 
> now.toString() 
"Thu Jun 12 2014 20:35:33 GMT+0100 (GMT Daylight Time)" 
> now.toUTCString() 
"Thu, 12 Jun 2014 19:35:33 GMT" 

编辑:现在我们有更多的信息:

  • 如果你需要在一个特定的时间段来显示特定瞬间,我建议你在服务器端
  • 到文本转换如果你需要一个本地时间发送回服务器,我建议你在文本这么做
  • 如果可能可以,我会避免有一个“帐户时区”的想法 - 尽可能将所有内容存储为UTC。通过所有方法都可以在特定的时区渲染值,用户应该能够控制这些值,但是您应该尽量避免使用时区进行任何算术运算。

如果你打算在.NET方面做更多的工作,你可能也想看看我的​​。

+0

GMT偏移量实际上是我正在处理的应用程序所需要的。是否真的没有办法(或解决)'日期'对象来更新时区? –

+2

@Cyber​​neticTwerkGuruOrc:你错过了这一点 - 那里的*是*没有时区在'日期'对象中。如果你需要从UTC到Mountain Time的偏移量,这相对比较棘手 - 因为你会依靠跨浏览器获取该时区的方式。如果你可以解释(在问题中)更多关于你想要达到的目标,我们可能会帮助你更多。 –

+0

更新了我的开场白。它仍然有点模糊,但我认为这应该涵盖我需要改变时区的原因(以及为什么抵消问题很重要)。我明白'日期'基本上是毫秒,但我只是想知道是否仍然有办法改变偏移量。 –