首页 > 解决方案 > 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"
        }
    }

我期待以下输出:

但是,我将在 2020 年 12 月 30 日获得prettyDueDate

如果我使用 %Y 而不是 %G 它会按预期工作。

%G 是用于年份 (0000-9999) 的 ISO 标准格式。我正在使用 mongo 版本 4.0.13

谁能解释为什么会这样?用于报告的相当多的聚合具有这种格式字符串,我真的很想避免必须全部更改它们

标签: mongodbaggregation-framework

解决方案


这是预期的行为,%G因为它使用的是“周编号年”日历。

这里有对这种行为的非常详细的解释。我复制了下面的一小部分解释:

文档中的短语“ISO 8601 格式”是指一种指定日期的方法,该方法按周数和天数而不是传统的月份和日期来分解它们。这种格式的年份总是从星期一开始,因此在 12 月 31 日不是星期日的年份,它被 ISO 8601 日历视为下一年的一部分。


推荐阅读