Data.now()和new Data().getTime()的区别
时间: 2024-04-27 13:22:57 浏览: 21
`Date.now()` 方法返回当前时间的时间戳(自1970年1月1日 00:00:00 UTC以来的毫秒数),不需要创建一个新的 Date 对象。而 `new Date().getTime()` 是创建一个新的 Date 对象,并返回该对象表示的时间的时间戳。因此,前者更加简洁高效,而后者会创建一个新对象,增加了额外的开销。
相关问题
const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() const _ = db.command // 云函数入口函数 exports.main = async (event, context) => { console.log(event) const {allData} = event const ID = allData.threepartyid + allData.groupmemberid const checkRes = await db.collection('usersinternet').where({_id: ID}).get(); if (checkRes.data.length > 0) { let res = {AlreadyExists: true} return res }else { await db.collection('usersdatas').doc(allData.threepartyid).update({ data: { groupmembersid: _.addToSet(ID), } }); await db.collection('usersdatas').doc(allData.groupmemberid).update({ data: { threepartysid: _.addToSet(ID), } }); if(allData.threepartyid === allData.groupmemberid){ await db.collection('usersinternet').doc(ID).set({ data: { //qrcodesid: q, isThreeParty: true, threepartyid: allData.threepartyid, isGroupMember:'', isNoGroupMember: true, threepartycreators: allData.threepartycreators, threepartymobile: allData.threepartymobile, threepartypartName: allData.threepartypartName, productvolume: allData.productvolume, groupmemberid: allData.groupmemberid , groupmembercreators: allData.groupmembercreators, groupmembermobile: allData.groupmembermobile, isGroupRegister: true , isEnable: true , createdatatime: Date.now(), startdate: allData.startdate, closedate:'', } }); }else{ await db.collection('usersinternet').doc(ID).set({ data: { //qrcodesid: q, threepartyid: allData.threepartyid, isGroupMember:'', isNoGroupMember: true, threepartycreators: allData.threepartycreators, threepartymobile: allData.threepartymobile, threepartypartName: allData.threepartypartName, productvolume: allData.productvolume, groupmemberid: allData.groupmemberid , groupmembercreators: allData.groupmembercreators, groupmembermobile: allData.groupmembermobile, isGroupRegister: true , isEnable: true , createdatatime: Date.now(), startdate: allData.startdate, closedate:'', } }); }; let ok = '用户关系网设置成功' return ok } }这个云函数你是否能找出问题,并指出问题,最好能优化代码,把优化后的代码发给我
这个云函数存在一些问题,我列出如下:
1.云函数的参数中没有设置allData对象,应该从event中获取。
2.云函数中的代码缺少错误处理和异常情况的处理逻辑,建议加上try-catch块。
3.更新usersdatas集合时,应该使用set操作符而不是update操作符,因为addToSet操作符只能用于set操作符。
4.在更新usersdatas集合时,应该首先获取文档,然后判断文档是否存在,如果不存在则需要创建一个新的文档。
5.在更新usersinternet集合时,应该首先获取文档,然后判断文档是否存在,如果不存在则需要创建一个新的文档。
6.在更新usersinternet集合时,应该使用update操作符而不是set操作符,因为set操作符会覆盖整个文档。
7.在更新usersinternet集合时,应该判断allData.threepartyid和allData.groupmemberid是否相等,如果相等则只需要设置isNoGroupMember标志位为true,否则需要同时设置isGroupMember和isNoGroupMember标志位为true。
8.在更新usersinternet集合时,应该将startdate和closedate转换成时间戳,并在查询时对时间戳进行比较。
9.在更新usersinternet集合时,应该将createdatatime设置为服务器端的时间,而不是客户端的时间,因为存在时区差异。
下面是我修改后的云函数代码:
```javascript
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()
const _ = db.command
exports.main = async (event, context) => {
const { allData } = event
try {
// 判断是否已存在关系网
const ID = allData.threepartyid + allData.groupmemberid
const checkRes = await db.collection('usersinternet').doc(ID).get()
if (checkRes.data) {
return { AlreadyExists: true }
}
// 更新usersdatas集合
const threepartyDoc = await db.collection('usersdatas').doc(allData.threepartyid).get()
if (!threepartyDoc.data) {
await db.collection('usersdatas').doc(allData.threepartyid).set({ data: {} })
}
const groupmemberDoc = await db.collection('usersdatas').doc(allData.groupmemberid).get()
if (!groupmemberDoc.data) {
await db.collection('usersdatas').doc(allData.groupmemberid).set({ data: {} })
}
await db.collection('usersdatas').doc(allData.threepartyid).set({
data: {
groupmembersid: _.addToSet(ID),
},
})
await db.collection('usersdatas').doc(allData.groupmemberid).set({
data: {
threepartysid: _.addToSet(ID),
},
})
// 更新usersinternet集合
const startdate = new Date(allData.startdate).getTime()
const closedate = allData.closedate ? new Date(allData.closedate).getTime() : null
const isGroupMember = allData.threepartyid !== allData.groupmemberid
const isNoGroupMember = true
const createdatatime = Date.now()
const updateData = {
threepartyid: allData.threepartyid,
groupmemberid: allData.groupmemberid,
threepartycreators: allData.threepartycreators,
groupmembercreators: allData.groupmembercreators,
threepartymobile: allData.threepartymobile,
groupmembermobile: allData.groupmembermobile,
threepartypartName: allData.threepartypartName,
productvolume: allData.productvolume,
isGroupMember,
isNoGroupMember,
isGroupRegister: true,
isEnable: true,
createdatatime,
startdate,
closedate,
}
if (isGroupMember) {
await db.collection('usersinternet').doc(ID).update({ data: updateData })
} else {
await db.collection('usersinternet').doc(ID).set({ data: updateData })
}
return { message: '用户关系网设置成功' }
} catch (err) {
console.log(err)
return { errCode: -1, errMsg: '服务器繁忙,请稍后重试' }
}
}
```
execTime() { if(this.data.datas == null || this.data.datas.length <= 0) return for(let i = 0;i<this.data.datas.length;i++) { if(this.data.datas[i].type != 3) continue; if(this.data.datas[i].countdownSecond <= 0) continue; let timeStamp = this.data.datas[i].countdownSecond * 1000 timeStamp -= 1000 let countdownSecondName = 'datas[' + i + '].countdownSecond' this.setData({ [countdownSecondName]: timeStamp }) if(timeStamp <= 0) { this.setData({ [countdownSecondName]: 0 }) } } }这是定时器里面方法 外面是定时器 this.data.timer = setInterval(function() { that.execTime() },1000),timeStamp错误
根据你提供的代码,我发现在执行倒计时的时候,计算时间戳的方式是有问题的。具体来说,在倒计时的过程中,每次将 `countdownSecond` 减去 1000 毫秒,然后将其赋值给 `timeStamp`,这样得到的时间戳是不准确的。因为实际上,倒计时的时间并不是精确的整秒,而是包含毫秒的小数值。
为了解决这个问题,你可以使用 JavaScript 内置的 `Date()` 对象来获取当前时间的时间戳,然后再通过比较当前时间戳和倒计时结束的时间戳之间的差值,来计算出剩余的倒计时时间。具体的实现可以参考下面的代码:
```
execTime() {
if (this.data.datas == null || this.data.datas.length <= 0) return;
for (let i = 0; i < this.data.datas.length; i++) {
if (this.data.datas[i].type != 3) continue;
if (this.data.datas[i].countdownSecond <= 0) continue;
const now = new Date().getTime(); // 获取当前时间戳
const end = this.data.datas[i].countdownSecond * 1000; // 获取倒计时结束的时间戳
let diff = end - now; // 计算当前时间与倒计时结束时间之间的差值
if (diff > 0) {
// 如果倒计时还未结束
this.setData({
['datas[' + i + '].countdownSecond']: Math.ceil(diff / 1000) // 向上取整,得到剩余的秒数
});
} else {
// 如果倒计时已经结束
this.setData({
['datas[' + i + '].countdownSecond']: 0
});
}
}
}
```
注意,这里使用了 `Math.ceil()` 对得到的剩余秒数进行了向上取整,以保证倒计时的精度。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![js](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)