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
}

尽管您的问题未包含在内,但我会做出以下假设:

  • 传给createNewSmsReminderdateTime参数确实是一个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.

中显示的相同结果

简而言之 - 这是正常行为。您的程序运行正常。