问题描述
当我在数据库中保存一些提醒时,我正在开发应用程序。下面是此函数的代码片段:
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 console.log(dateTime)
上返回:
Mon Sep 28 2020 13:04:42 GMT-0400 (Eastern Daylight Time)
但是当我观察到请求的有效负载时,我注意到时间戳已转换为UTC格式:
{
content: "This is a test",when: "2020-09-28T17:04:42.158Z"
}
此正常行为是由fetch / chrome /其他我没有想到的强制执行的,还是我做错了什么?另外,如果这是正常现象,是否在不同的浏览器中保持一致,还是我将来希望获得令人讨厌的惊喜?有什么办法可以强制执行吗? (值得一提的是,这正是我所追求的行为)
编辑:下面的问题是我的p_authorization方法:
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
}
解决方法
尽管没有提出您的问题,但我假设以下内容:
- 传递给
dateTime
的{{1}}参数确实是一个createNewSmsReminder
对象 -
Date
函数在传入的p_authorisation
对象上调用JSON.stringify
,并将其分配给它返回的对象的body
属性。
当对body
对象或包含Date
对象的对象进行字符串化时,将调用Date.toJson
函数,该函数依次调用Date.toISOString
以创建ISO 8601 JSON中使用的字符串表示形式。
Date
函数始终返回toISOString
对象的UTC表示。这与Date
没有任何关系-它只是fetch
对象的工作方式。
Date
对象内部仅存储一件事-精度为毫秒的Unix timestamp。因此,尽管它有名字,但它不是 date ,而是基于UTC的 timestamp 。
此外,当您在Date
对象上调用console.log
时,该行为是特定于实现的。没有定义输出内容的规范。 (ECMAScript定义了Date
,但没有定义Date
,而WHATWG Console standard拒绝了我要求将记录Console
对象in issue #132的输出形式化的请求。)
当前情况是一些实现将记录Date
的输出-以人类可读格式表示的本地时间,而其他实现将记录toString
,以UTC和ISO 8601扩展格式表示。
由于实现方式可能会有所不同-您不应直接记录toISOString
对象。而是记录这两个函数之一的字符串输出。换句话说,如果您执行Date
,将获得与JSON中所示相同的结果。
简而言之-这是正常现象。您的程序正常运行。