4

我试图向 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

我做错了吗?

4

2 回答 2

2

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

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

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

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

这将为您提供一个值,例如/Date(1372728650261)/适合传递给 .Net 的值,并最终为您提供一个DateTime对象 where .Kindis Utc

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

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

它会给你一个值,比如/Date(1372728650261-0700)/. 这符合DataContractJsonSerializer.Net 中类的要求。请参阅这些文档中标题为“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类型。

于 2013-07-02T01:52:34.293 回答
0

我不确定,但请尝试检查您的 asp.net Datetime 是否使用本地时间、UTC 或未指定用于反序列化。

于 2013-07-01T10:24:22.490 回答