Momentjs UTC时间很奇怪

时间:2013-07-01 09:25:27

标签: javascript asp.net date momentjs

我试图像这样发送api一个asp.net UTC时间戳:

d = new Date()
test = moment(d).utc().valueOf()
test2 = moment(d).utc().format("ZZ")
utc_asp = "/Date("+test+test2+")/"
console.log utc_asp
>> /Date(1372670700799+0000)/ 

但服务器获取的时间与本地时间相同?

或者这个:

console.log moment(d)
console.log moment(d).utc()

D {_i: Mon Jul 01 2013 11:26:10 GMT+0200 (SAST), _f: undefined, _l: undefined, _isUTC: false, _d: Mon Jul 01 2013 11:26:10 GMT+0200 (SAST)…}
 index.js:39
D {_i: Mon Jul 01 2013 11:26:10 GMT+0200 (SAST), _f: undefined, _l: undefined, _isUTC: true, _d: Mon Jul 01 2013 11:26:10 GMT+0200 (SAST)…}

这样做:

console.log moment(now).utc().hour()
>> 9 - This is correct! Its 11 - 2, but how come the above

我做错了吗?

2 个答案:

答案 0 :(得分:2)

要创建当前日期的时刻,只需使用moment(),不带任何参数。

var m = moment();  // returns a moment representing "now"

如果您希望使用MS专有/Date()/格式对其进行格式化,则可以使用:

m.format("/[Date](XSSS)/")

这将为您提供适合传递给.Net的/Date(1372728650261)/等值,并最终为您提供DateTime .Kind Utcm.format("/[Date](XSSSZZ)/") 的对象。< / p>

如果您想要带偏移的扩展格式,可以使用:

/Date(1372728650261-0700)/

它会返回一个DataContractJsonSerializer之类的值。这符合.Net中DataContractJsonSerializer类的要求。请参阅these docs中标题为“DateTime Wire Format”的部分。

但是,我强烈建议您不要使用后一种格式。它只能被JavaScriptSerializer识别,并且文档明确声明您提供的任何偏移都将被忽略 - 而是使用服务器自己的偏移量。这是相当愚蠢的,但这就是它的作用。如果您使用的是2013-07-01T18:38:29-07:00类,则偏移也会被忽略,但它的行为与DCJS不同(保持UTC而不是本地)。

就此而言,我建议完全放弃这种奇怪的格式。请改用ISO8601标准(例如,moment().format() // it's the default, no need to specify anything. )。这可以通过momentjs轻松完成,并且是默认格式。

DateTimeOffset

在服务器端,使用JSON.Net,默认情况下也使用此格式。如果您真的关心偏移量,请使用服务器上的DateTime类型而不是{{1}}类型。

答案 1 :(得分:0)

我不确定,但请检查您的asp.net Datetime是否使用localtime,utc或未指定进行反序列化。