javascript – Momentjs UTC时间很奇怪

我试图发送一个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

我做错了吗?

最佳答案 要从当前日期创建一个时刻,只需使用不带任何参数的moment().

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

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

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

这将为您提供一个值,例如/ Date(1372728650261)/,它适合传递给.Net,最终会为您提供一个DateTime对象,其中.Kind是Utc.

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

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

它会返回一个值,如/ Date(1372728650261-0700)/.这符合.Net中DataContractJsonSerializer类的要求.请参阅these docs中标题为“DateTime Wire Format”的部分.

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

就此而言,我建议完全放弃这种奇怪的格式.请改用ISO8601标准(例如,2013-07-01T18:38:29-07:00).这可以通过momentjs轻松完成,并且是默认格式.

moment().format() // it's the default, no need to specify anything.

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

点赞