【问题标题】:Does fetch always sends UTC timestamps?fetch 是否总是发送 UTC 时间戳?
【发布时间】:2020-09-28 17:26:50
【问题描述】:

当我在数据库中保存一些提醒时,我正在开发一个应用程序。下面是这个函数的代码sn-p:

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_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
}

【问题讨论】:

  • 什么是p_authorisation
  • 我在原帖中添加了方法。

标签: javascript reactjs redux timezone timezone-offset


【解决方案1】:

虽然您的问题没有提及,但我会假设以下内容:

  • 传递给createNewSmsReminderdateTime参数确实是Date对象
  • p_authorisation 函数通过传入的body 对象调用JSON.stringify,并将其分配给它返回的对象的body 属性。

当您对Date 对象或包含Date 对象的对象进行字符串化时,将调用Date.toJson 函数,该函数又调用Date.toISOString 来创建在JSON 中使用的ISO 8601 字符串表示。

toISOString 函数总是 返回Date 对象的UTC 表示。这与fetch 没有任何关系——这只是Date 对象的工作原理。

Date 对象在内部只存储一件事——Unix timestamp,精度为毫秒。因此,尽管它的名字,它不是一个 date,而是一个基于 UTC 的 timestamp

此外,当您在 Date 对象上调用 console.log 时 - 行为是特定于实现的。没有规范定义输出应该是什么。 (ECMAScript 定义了Date,但没有定义ConsoleWHATWG Console standard 拒绝了我将日志记录输出形式化的请求Date 对象in issue #132。)

目前的情况是 一些 实现会记录toString 的输出 - 以人类可读格式表示的本地时间,而其他实现会记录@987654348 的输出@,以 UTC 表示,采用 ISO 8601 扩展格式。

由于实现可能会有所不同 - 您不应直接记录 Date 对象。相反,记录这两个函数之一的字符串输出。换句话说,如果您执行console.log(dateTime.toISOString()),您将获得与 JSON 中显示的结果相同的结果。

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

【讨论】:

  • 完全正确,但 imo 假设太多。最好先发表评论询问详情。
  • 嗨@Matt Johnson-Pint,感谢您的回复。您的假设实际上是正确的,我确实在 p_authorisation 方法中的请求正文上使用了 JSON.stringify。事实上,我已经编辑了我最初的问题以添加该方法。感谢您抽出宝贵时间深入探讨此问题,您的回复帮助我更好地了解了我的方法的行为。
猜你喜欢
  • 2015-08-29
  • 2011-06-16
  • 2020-06-03
  • 2012-06-17
  • 2013-05-09
  • 2017-01-11
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多