unicloud云函数时间慢8小时的解决方案
最近在做uniapp+unicloud小程序项目的时候,本地运行的时候一切正常,部署到云端运行的时候,发现保存在数据库中的时间慢了8个小时。
经过查资料才知道,unicloud云函数中使用的时区是utc+0,而标准的北京时间时区应该是utc+8,所以在云函数中使用时间就要特别注意这点。在hbuilderX中本地运行时,使用的是电脑上的时间,所以就会出现上面说的本地运行一切正常,部署到云端慢8个小时。
最简单的解决方案就是直接在获取的时间上加8个小时,当然这种方式本质上是没有多大问题,但是本地测试的时候就会快8个小时,所以治本不治标。那么怎么避免这个问题呢?
获取当前时间
为了快捷开发项目,我在云函数中使用了moment.js时间处理类库,也可以自己去写一个获取时间的函数,这里为了方便演示,我就直接使用库来介绍:
首先引入库:
const moment = require('moment');
使用库获取当前时间:
const time = moment().format('YYYY-MM-DD HH:mm:ss');
上面的方法就可以获取当前的时间,本地没问题,但是云端就会慢8个小时,如果使用new Date()的方式获取,效果是一样的。
兼容本地和云端标准时间
使用new Date().getTimezoneOffset()
来判断,如果结果为0就加8小时,如果不为0就正常获取时间,js中的getTimezoneOffset()
的意思是方法返回 UTC 时间和本地时间之间的时差,以分钟为单位。
兼容使用(最终方案):
const time = new Date().getTimezoneOffset()==0? moment().add(8, 'hours').format('YYYY-MM-DD HH:mm:ss') : moment().format('YYYY-MM-DD HH:mm:ss');
总结:与其绞尽脑汁的空想为什么会这样,还不如多查阅资料多学习,任何问题总会有解决方案的~加油!!!