Squ*_*gle 6 javascript datetime stored-procedures azure-cosmosdb
对CosmosDB存储过程及其处理new Date()和日期比较的指导有限 .
以下代码是一个CosmosDB存储过程,用于在给定时间后"冻结"文档的写入.该物业currentDoc.FreezeDate采用ISO-8601格式,例如'2017-11-15T13:34:04Z'.
注意:这是我想要了解的情况的一个例子.它不是生产代码.
function tryUpdate(newDoc) {
__.queryDocuments(
__.getSelfLink(),
{ /* query to fetch the document */ },
(error, results) => {
var currentDoc = results[0]; // doc from the database
// fail if the document is still locked
if (new Date(currentDoc.FreezeDate) < new Date()) {
getContext().getResponse().setBody({ success: false });
return;
}
// else update the document
/* snip */
}
);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:在CosmosDB存储过程中,new Date()受时区的影响,特别是考虑到数据库可能与调用代码位于不同的区域?这里的日期比较代码在所有情况下都有效吗?
据我所知,CosmosDB 存储的 DateTime 值没有相应的时区。不是 DateTimeOffset。这意味着代码在哪里执行并不重要,因为它总是标准化为如下所示:
"2014-09-15T23:14:25.7251173Z"
Run Code Online (Sandbox Code Playgroud)
Javascript Date 对象是时间戳 - 它们仅包含自纪元以来的毫秒数。Date 对象中没有时区信息。该时间戳代表哪个日历日期(日、分、秒)是解释问题(to...String 方法之一)。
换句话说,无论你在世界的哪个地方,new Date()内心永远都会有相同的价值。
如果您想消除不确定性以换取可读性,我建议仅存储自纪元(Unix 时间)以来的秒数或毫秒数。这也是日期内部使用的内容(new Date().value- 毫秒)。顺便说一下,内部的cosmos文档字段_ts也是纪元格式的时间戳。
请注意, 的值new Date()可能会偏离“正确的全球时间”几分钟 - 我不知道 Azure/Cosmos 是否保证一定的偏差窗口。