mongodb - MongoDB $dateToString 格式表达式 %G 奇怪的行为
问题描述
我有一份文件,其中包含以下属性
{
dueDate: ISODate("2019-12-29T13:00:00.000Z")
}
我正在构建一个聚合,在 $project 阶段,我正在尝试以下操作:
"utcDueDate": "$dueDate",
"rawDueDate" : {
"$dateToString" : {
"date" : "$dueDate",
"timezone" : "Australia/Sydney"
}
},
"prettyDueDate" : {
"$dateToString" : {
"date" : "$dueDate",
"format" : "%d/%m/%G",
"timezone" : "Australia/Sydney"
}
}
我期待以下输出:
utcDueDate: 2019-12-29T13:00:00.000Z
rawDueDate: 2019-12-30T00:00:00.000Z
prettyDueDate: 30/12/2019
但是,我将在 2020 年 12 月 30 日获得prettyDueDate。
如果我使用 %Y 而不是 %G 它会按预期工作。
%G 是用于年份 (0000-9999) 的 ISO 标准格式。我正在使用 mongo 版本 4.0.13
谁能解释为什么会这样?用于报告的相当多的聚合具有这种格式字符串,我真的很想避免必须全部更改它们
解决方案
这是预期的行为,%G
因为它使用的是“周编号年”日历。
这里有对这种行为的非常详细的解释。我复制了下面的一小部分解释:
文档中的短语“ISO 8601 格式”是指一种指定日期的方法,该方法按周数和天数而不是传统的月份和日期来分解它们。这种格式的年份总是从星期一开始,因此在 12 月 31 日不是星期日的年份,它被 ISO 8601 日历视为下一年的一部分。
推荐阅读
- java - 如何使用带有 xslt 的撒克逊指定输出到 xml 文件?
- c# - 我可以通过扩展方法在运行时扩展类型吗
- html -
看起来不像预期的那样 - google-calendar-api - Google 日历在“子”时间更新后无法跟踪“子”事件
- flutter - 运行颤振时的SocketExeption
- mysql - 是否可以为此创建一个 SELECT ?
- php - 如何在没有作曲家的情况下使用 Stripe payment Getaway PHP Library?
- c# - 使用 C# 在 bot 框架 v4 中的 azure sql 数据库上存储聊天日志
- c# - C# 事件不适用于不同的解决方案
- java - 当我从 IOS 平台上的 ionic 5 项目发送请求时,会话无法正常工作,但在 Android 上工作正常