收藏
回答

云函数设置时区,对聚合操作dayOfYear无效

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 工具 wxb3a2467cb7f45074 test-m3cw3 2.15.0

云函数设置时区无效, 8点前的数据在dayOfYear中还是归在昨天,

函数里设置 process.env.Tz ='Asia/Shanghai'也没用

什么原因?应该怎么处理

const db = cloud.database()
const _ = db.command
const $ = _.aggregate
const coll_car = db.collection("car")
coll_car.aggregate()
      .match(_.expr(
        $.and([
          $.eq([$.month('$startDateTime'), month]),
          $.eq([$.year('$startDateTime'), year]),
        ])
      ))
      .group({
        _id: $.dayOfYear("$startDateTime"),
        num: $.sum(1)
      })
      .end()
      .then(res => {
        console.log(res)
      }).catch(err => {
        console.log(err)
      })
回答关注问题邀请回答
收藏

3 个回答

  • 兔头
    兔头
    2021-03-15

    曲线救国了,在聚合操作中把时间加上8小时。这里又改回时间戳了:startTime为时间戳

    $.add()可以计算时间,第一个参数为date时,返回date。

    坑1:本地云查询中,聚合操作中new Date()会报错!而云函数不会!

    坑2:本地$.toDate()函数可以使用!而云环境不行!

    MongoDB4.0才支持toDate。本地的sdk不知道什么鬼

    coll_car.aggregate()
          .project({
            //不支持toDate
              // startDateTime: $.add([$.toDate('$startTime'), 28800000]),
            startDateTime: $.add([new Date(28800000), "$startTime"])
          })
          .match(_.expr(
            $.and([
              $.eq([$.month('$startDateTime'), month]),
              $.eq([$.year('$startDateTime'), year]),
            ])
          ))
          .group({
            _id: $.dayOfYear("$startDateTime"),
            num: $.sum(1)
          })
          .sort({
            _id1
          })
          .end()
    
    2021-03-15
    有用 1
    回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2021-03-16

    你好,可参考这里来处理下https://docs.cloudbase.net/cloud-function/timezone.html

    2021-03-16
    有用
    回复
  • 易
    2021-03-15

    可能和云函数的版本有关,我新创建的云函数就可以 使用Tz ='Asia/Shanghai',正常。

    2021-03-15
    有用
    回复 1
    • 兔头
      兔头
      2021-03-15
      不行,同一天的八点前和八点后还是被分成两天
      2021-03-15
      回复
登录 后发表内容
问题标签