提取是否总是发送UTC时间戳?

问题描述

当我在数据库中保存一些提醒时,我正在开发应用程序。下面是此函数代码片段:

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中所示相同的结果。

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