在javascript(moment.js)中将UTC日期转换为当地时间

时间:2017-04-15 09:29:09

标签: javascript asp.net-mvc asp.net-web-api2 momentjs

我从ASP.NET webapi2服务收到以下日期作为JSON数据。

{
    creationDate: "2014-11-18T15:16:56.363"
    ... //other fields...
}

系统中的日期存储为UTC日期,与时区无关。 当数据返回并显示在屏幕上时,会使用不正确的时间,因为时刻假定要解析的日期是本地时间,而不是UTC。

moment(text).tz('Africa/Johannesburg').fromNow();

过去给我两个小时的时间值,当时它们应该是最新的。如何解析/传递日期,以便知道它应该添加时区。在我的情况下,GMT + 2或SAST。

添加时区(GMT)似乎无济于事。

Date.parse('2017-04-15T09:09:48.9590011 UTC')

结果为NaN

2 个答案:

答案 0 :(得分:1)

您至少有两个选择:

  1. 在字符串末尾添加Z

    moment(creationDate + "Z")
    
  2. 使用.utc然后.local

    moment.utc(creationDate).local()
    
  3. 以下是一个例子,使用的日期几乎总是在夏令时("夏令时"),以便它甚至适用于我们在英国的人(谁格林威治标准时间是如此,所以我们很难判断我们是否获得了UTC或本地结果:-)):

    
    
    var creationDate = "2014-05-18T15:16:56.363";
    console.log("String:", creationDate);
    console.log("1:", moment(creationDate + "Z").toString());
    console.log("2:", moment.utc(creationDate).local().toString());
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

问题是,当您发送/接收客户端和服务器将尝试转换为其时区的日期时,诀窍是,将日期作为字符串传递。 当您返回或发送数据时,请删除&#34; T&#34;

{
    creationDate: "2014-11-18 15:16:56.363"
    ... //other fields...
}

OR

data.creationDate.replace('T', ' ')

因此,当客户收到数据时,它不会更改或转换日期。然后你可以使用

new Date(moment(data.creationDate.replace('T', ' ')))

这将返回您从服务器发送的内容