收藏
评论

云开发 Date 时区问题

背景:使用云函数从云数据库获取日期为大于今天00:00时,小于今天23:59时的数据,发现取出的数据异常,有间隔8小时规律


实际探究结论:


  1. 在云函数中,new Date(), 返回的是 UTC标准时间-0时区

  2. 在云函数查询数据库,返回值中的Date类型,返回的也是 UTC标准时间-0时区

  3. 而在云数据库界面上操作的是填写时候看到的是RFC-2822格式标准, 东八区时间, 而直接查询返回的是ISO-8601格式标准, UTC标准时间-0时区。举例,在云数据库界面上填写并展示的是 Wed Nov 21 2018 00:02:00 GMT+0800 (CST), 而通过查询返回的时间是 2018-11-20T16:02:00.000Z。


所以假设今天日期为 2018-11-21 当某条数据在云数据库的时间显示为, Wed Nov 21 2018 00:02:00 GMT+0800 (CST),由上述结论得出实际的UTC时间为 2018-11-20T16:02:00.000Z, 根据我的业务逻辑(查询今日的数据),我需要做如下操作



    const now = new Date(); // 云函数当前的 UTC 0时区 标准时间,

                           //例如当前时间为2018-11-21 9:00:00, 则now= 2018-11-21T01:00:00.000Z

    const now_gone =

     + 8 * 3600000 // 东八区与0时区的时间差

     + now.getUTCHours() * 3600000

     + now.getUTCMinutes() * 1000 * 60

     + now.getUTCSeconds() * 1000 // 总和为 UTC今天已走过的时间 + 东八区时间差, 也就是东八区已经走过的时间


    const startDate = new Date(now - now_gone);


    const endDate = new Date(now - now_gone + 24 * 3600000);
    return db.collection('***').where({
      **Date: _.and(_.gt(startDate), _.lt(endDate))
    }).get()


其实总结下来,就是 云函数 new Date(),是0时区的时间,与中国东八区时间由8小时间隔,计算的时候需要处理一下

最后一次编辑于  2018-11-21  (未经腾讯允许,不得转载)
收藏赞 4