我试图在我的FireBase Cloud FireStore
中存储一个文档,该文档具有两个Timestamp
字段:PurchaseDate
和ExpirationDate
。
PurchaseDate
为当前日期,ExpirationDate
为当前日期后2周。
我正在使用一个post
云函数请求来设置文档。
我能够实现当前日期(purchaseDate)是这样的:
const purchaseDate = admin.firestore.Timestamp.now();
但我不知道如何实现从当前日期起2周的时间戳
。
我试过用几种方法来实现它,包括这个例子,但都没有成功:
admin.firestore.Timestamp.fromDate(purchaseDate + 12096e5); //12096e5 = 2 weeks in ms
知道我怎样才能实现吗?
非常感谢!
一种可能的方法,只需使用timestamp
的构造函数,并将正确的秒数添加到purchasedate
:
const TWO_WEEKS_IN_SECONDS = 14*24*60*60
const purchaseDate = admin.firestore.Timestamp.now()
const expirationDate = new admin.firestore.Timestamp(
purchaseDate.seconds + TWO_WEEKS_IN_SECONDS,
purchaseDate.nanoseconds)
console.log(purchaseDate.toDate())
console.log(expirationDate.toDate())
当然,这取决于您是否需要传递纳秒值。
当前的问题是fromDate
需要一个date
对象,而不是一个Firestoretimestamp
。 如果您真的想要通过Date对象,这也可以为您工作(注意,这会将精度从纳秒降低到毫秒):
const TWO_WEEKS_IN_MS = 1000*TWO_WEEKS_IN_SECONDS
const twoWeekOutDate = new Date();
twoWeekOutDate.setTime(purchaseDate.toDate().getTime() + TWO_WEEKS_IN_MS)
const alternative = admin.firestore.Timestamp.fromDate(twoWeekOutDate)
console.log(alternative.toDate())
虽然Robsiemb中的方法存储了正确的值,但它使用客户端时间戳来实现这一点。 这意味着它可能被恶意用户操纵,如果您没有适当地保护它。
这在您的用例中可能是完全正确的,但是我想留下一些额外的想法和选项:
>
在允许客户端代码确定时间戳时,使用FireBase的服务器端安全规则来确保存储的日期在合理的范围内。
例如,您可以在规则中使用request.time
来确保该字段从现在起大约两周。 这确保恶意用户无法将他们自己的截止日期设置为比您所希望的更长或更短的日期。
另一种选择是将实际创建日期存储为服务器端时间戳,并单独存储过期间隔。 这通常会使验证数据变得更容易,但会使查询过期数据变得稍微棘手,因为您必须同时查询这两个字段。
另一种选择是让客户机将创建日期作为服务器端时间戳写入,然后让云函数基于此使用过期时间戳更新文档。