在.NET和JavaScript之间使用UTC日期

时间:2012-04-23 15:43:38

标签: javascript asp.net-mvc json

我正在使用ASP.NET MVC,我希望以UTC格式将所有DateTime值存储在服务器上。我希望DateTime值的所有传输都是UTC格式。但我想在本地时间在浏览器中显示DateTimes。我一直感到困惑,无法让它发挥作用。以下是我的流程......

在我的用户界面中,用户可以输入一个日期,我将其组成一个字符串并用于创建一个Date对象。最终看起来像这样:

var dt = new Date("3/23/2012 8:00 AM");

因此,用户打算在其上午8点创建日期。现在我希望以UTC格式将其发送到服务器,所以我有这个方法:

Date.prototype.toUTC = function ()
{
    var self = this;
    return new Date(self.getUTCFullYear(), self.getUTCMonth(), self.getUTCDate(), self.getUTCHours(), self.getUTCMinutes());
};

我喜欢这样使用:

data.startDt = dt.toUTC();  //Data is the object being set to the server

然后我使用jQuery进行Ajax调用,将数据对象发送到服务器。在我调试的服务器上,检查进来的数据时,我看到StartDt(映射到.NET DateTime对象)为{3/23/2012 12:00:00 PM}。

这是我存储在数据库中的值。我不完全确定它是否正确。

客户端和服务器均位于美国东部(UTC-05:00)。

现在,当我以JSON格式将此日期发送回客户端时,.NET会发送:

"/Date(1332518400000)/"

在JavaScript中,我用这种方式解析它:

var dt = new Date(parseInt(serverDt.substr(6)));    //parseInt ingnores last /

我的想法是dt是UTC日期,但我可以通过调用toShortTime()以本地格式显示它,如下所示:

Date.prototype.get12Hour = function ()
{
    var h = this.getHours();
    if (h > 12) { h -= 12; }
    if (h == 0) { h = 12; }
    return h;
};

Date.prototype.getAMPM = function ()
{
    return (this.getHours() < 12) ? "AM" : "PM";
};

Date.prototype.toShortTime = function ()
{
    return this.get12Hour() + ":" + this.getMinutes() + " " + this.getAMPM();
};

但那不会让我回到我想要的上午8点。它给了我12:00中午。我哪里错了?

3 个答案:

答案 0 :(得分:1)

在您的代码中,dt是UTC时间。您需要将其从UTC转换为当地时间 见Javascript: Convert a UTC Date() object to the local timezone

答案 1 :(得分:0)

您是否使用适当的DateTimeKind值构建.NET DateTime对象?您正在向服务器发送UTC相对值,我猜测它将该值存储为EDT相对时间而不是UTC相对时间,因此值不正确。正如你所说,1332518400000是美国东部时间下午12点,而不是UTC,它指的是服务器上的转录问题:

> new Date(1332518400000)
Fri Mar 23 2012 12:00:00 GMT-0400 (Eastern Daylight Time)

答案 2 :(得分:0)

这个功能对我很有效。

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}