fetch 是否总是发送 UTC 时间戳?
Does fetch always sends UTC timestamps?
当我在数据库中保存一些提醒时,我正在开发一个应用程序。下面是这个函数的代码片段:
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)
returns:
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/something 强制执行的,否则我什至无法想到,还是我做错了什么?此外,如果这是正常的,它在不同的浏览器中是否一致,或者我希望将来出现令人讨厌的惊喜?有什么办法可以强制执行吗? (值得一提的是,这正是我所追求的)
编辑:回答下面的问题是我的p_authorisation方法:
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
}
尽管您的问题未包含在内,但我会做出以下假设:
- 传给
createNewSmsReminder
的dateTime
参数确实是一个Date
对象
p_authorisation
函数在传入的body
对象上调用JSON.stringify
并将其赋值给它[=72]对象的body
属性 =].
当您对 Date
对象或包含 Date
对象的对象进行字符串化时,Date.toJson
function is invoked, which in turn calls Date.toISOString
会创建 JSON 中使用的 ISO 8601 字符串表示形式.
toISOString
函数始终returnsDate
对象的UTC表示。这与 fetch
没有任何关系 - 这只是 Date
对象的工作方式。
Date
对象在内部仅存储一件事 - 具有毫秒精度的 Unix timestamp。因此,尽管它的名字,它不是 date,而是基于 UTC 的 timestamp.
此外,当您在 Date
对象上调用 console.log
时 - 行为是 implementation-specific。没有定义输出应该是什么的规范。 (ECMAScript 定义了 Date
但没有定义 Console
,并且 WHATWG Console standard declined my request to formalize the output of logging Date
objects in issue #132。)
目前的情况是,一些 实现将记录 toString
的输出 - 以 human-readable 格式的本地时间,并且其他实现将记录 toISOString
的输出,这是根据 UTC 和 ISO 8601 扩展格式。
由于实现可能会有所不同 - 您不应直接记录 Date
对象。相反,记录这两个函数之一的字符串输出。换句话说,如果您执行 console.log(dateTime.toISOString())
,您将获得与 JSON.
中显示的相同结果
简而言之 - 这是正常行为。您的程序运行正常。
当我在数据库中保存一些提醒时,我正在开发一个应用程序。下面是这个函数的代码片段:
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)
returns:
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/something 强制执行的,否则我什至无法想到,还是我做错了什么?此外,如果这是正常的,它在不同的浏览器中是否一致,或者我希望将来出现令人讨厌的惊喜?有什么办法可以强制执行吗? (值得一提的是,这正是我所追求的)
编辑:回答下面的问题是我的p_authorisation方法:
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
}
尽管您的问题未包含在内,但我会做出以下假设:
- 传给
createNewSmsReminder
的dateTime
参数确实是一个Date
对象 p_authorisation
函数在传入的body
对象上调用JSON.stringify
并将其赋值给它[=72]对象的body
属性 =].
当您对 Date
对象或包含 Date
对象的对象进行字符串化时,Date.toJson
function is invoked, which in turn calls Date.toISOString
会创建 JSON 中使用的 ISO 8601 字符串表示形式.
toISOString
函数始终returnsDate
对象的UTC表示。这与 fetch
没有任何关系 - 这只是 Date
对象的工作方式。
Date
对象在内部仅存储一件事 - 具有毫秒精度的 Unix timestamp。因此,尽管它的名字,它不是 date,而是基于 UTC 的 timestamp.
此外,当您在 Date
对象上调用 console.log
时 - 行为是 implementation-specific。没有定义输出应该是什么的规范。 (ECMAScript 定义了 Date
但没有定义 Console
,并且 WHATWG Console standard declined my request to formalize the output of logging Date
objects in issue #132。)
目前的情况是,一些 实现将记录 toString
的输出 - 以 human-readable 格式的本地时间,并且其他实现将记录 toISOString
的输出,这是根据 UTC 和 ISO 8601 扩展格式。
由于实现可能会有所不同 - 您不应直接记录 Date
对象。相反,记录这两个函数之一的字符串输出。换句话说,如果您执行 console.log(dateTime.toISOString())
,您将获得与 JSON.
简而言之 - 这是正常行为。您的程序运行正常。