Javascript fetch是否总是发送UTC时间戳?
当我在数据库中保存一些提醒时,我正在开发一个应用程序。下面是此函数的代码段:Javascript fetch是否总是发送UTC时间戳?,javascript,reactjs,redux,timezone,timezone-offset,Javascript,Reactjs,Redux,Timezone,Timezone Offset,当我在数据库中保存一些提醒时,我正在开发一个应用程序。下面是此函数的代码段: const createNewSmsReminder = (textBody, dateTime) => { console.log(dateTime) let body = { 'content' : "This is a test", 'when' : dateTime
const createNewSmsReminder = (textBody, dateTime) => {
console.log(dateTime)
let body = {
'content' : "This is a test",
'when' : dateTime
}
saveNewReminderAction(urlParams.uuid, body)
}
它调用saveNewReminderAction:
export const createNewSmsReminderAction = (uuid, body) => (dispatch) => {
dispatch({type: CREATE_NEW_SMS_REMINDER_PENDING})
fetch(config.url.API_URL+'/api/subscription/'+uuid+'/reminder', p_authorisation('POST', body))
.then(response=> response.json())
.then(data => dispatch({type: CREATE_NEW_SMS_REMINDER_SUCCESS, payload: data}))
.catch(error => dispatch({type: CREATE_NEW_SMS_REMINDER_ERROR, payload: error}))
}
在createNewSms控制台上,log(dateTime)
返回:
2020年9月28日星期一13:04:42 GMT-0400(东部夏时制)
但当我观察请求的有效负载时,我注意到时间戳已转换为UTC格式:
{
content: "This is a test",
when: "2020-09-28T17:04:42.158Z"
}
这是fetch/chrome/强制执行的正常行为,还是我做了错事?此外,如果这是正常的,那么它在不同的浏览器中是否一致,或者我期待着在未来出现令人不快的惊喜?有没有办法强制执行?(值得一提的是,这正是我所追求的行为)
编辑:以下是我的p_授权方法:
const p_authorisation = (method, body) => {
let auth = {
method: method,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Origin': '',
'Authorization': 'Bearer ' + localStorage.getItem('token'),
// 'skip_before_action' : 'verify_authenticity_token'
},
body: body ? JSON.stringify(body) : ''
}
return auth
}
虽然你的问题没有提到,但我会假设:
- 传递给
的createnewsmrementer
参数实际上是一个dateTime
对象Date
函数在传入的p\u authorization
对象上调用body
,并将其分配给它返回的对象的JSON.stringify
属性body
Date
对象或包含Date
对象的对象进行字符串化时,将调用该函数,该函数反过来调用创建JSON中使用的ISO 8601字符串表示
toISOString
函数始终返回Date
对象的UTC表示形式。这与fetch
没有任何关系-这只是Date
对象的工作方式
Date
对象在内部只存储一个东西,即毫秒精度的a。因此,尽管名称不同,但它不是日期,而是基于UTC的时间戳
此外,当您在日期
对象上调用控制台.log
时,该行为是特定于实现的。没有定义输出应该是什么的规范。(ECMAScript定义日期
,但不定义控制台
,并且拒绝了我的请求,使日志记录日期
对象的输出形式化。)
目前的情况是,一些实现将记录toString
的输出,这是以人类可读的格式表示的本地时间,而其他实现将记录toISOString
的输出,这是以UTC和ISO 8601扩展格式表示的
由于实现可能会有所不同-您不应该直接记录日期
对象。而是记录这两个函数之一的字符串输出。换句话说,如果执行console.log(dateTime.toISOString())
操作,您将获得与JSON中显示的结果相同的结果
简言之,这是正常的行为。您的程序运行正常。虽然您的问题没有提到,但我将假设以下情况:
- 传递给
的createnewsmrementer
参数实际上是一个dateTime
对象Date
函数在传入的p\u authorization
对象上调用body
,并将其分配给它返回的对象的JSON.stringify
属性body
Date
对象或包含Date
对象的对象进行字符串化时,将调用该函数,该函数反过来调用创建JSON中使用的ISO 8601字符串表示
toISOString
函数始终返回Date
对象的UTC表示形式。这与fetch
没有任何关系-这只是Date
对象的工作方式
Date
对象在内部只存储一个东西,即毫秒精度的a。因此,尽管名称不同,但它不是日期,而是基于UTC的时间戳
此外,当您在日期
对象上调用控制台.log
时,该行为是特定于实现的。没有定义输出应该是什么的规范。(ECMAScript定义日期
,但不定义控制台
,并且拒绝了我的请求,使日志记录日期
对象的输出形式化。)
目前的情况是,一些实现将记录toString
的输出,这是以人类可读的格式表示的本地时间,而其他实现将记录toISOString
的输出,这是以UTC和ISO 8601扩展格式表示的
由于实现可能会有所不同-您不应该直接记录日期
对象。而是记录这两个函数之一的字符串输出。换句话说,如果执行console.log(dateTime.toISOString())
操作,您将获得与JSON中显示的结果相同的结果
简言之,这是正常的行为。你的程序运行正常。什么是
p\u授权
?我在我的原始帖子中添加了该方法。什么是p\u授权
?我在原始帖子中添加了该方法。完全正确,但我有太多的假设。最好先留下评论,询问细节。你好@Matt Johnson Pint,谢谢你的回复。您的假设事实上是正确的,我确实在p_授权方法中对请求体使用JSON.stringify。事实上,我已经编辑了我的初始问题来添加方法。感谢您花时间深入了解这个问题,您的回答帮助我对我的方法的行为有了很好的理解。完全正确,但我有太多的假设。最好先留下评论,询问细节。您好@Matt Johnson Pint,感谢您的回答。您的假设事实上是正确的,我确实在p_授权方法中对请求体使用JSON.stringify。事实上,我已经编辑了m