MongoDB $ dateToString格式表达式%G奇怪的行为

问题描述 投票:1回答:1

我有一个具有以下特性的文档

{
 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

但是,我要获得30/12/2020的prettyDueDate。

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

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

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

mongodb aggregation-framework
1个回答
0
投票

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

对此行为here有非常详细的说明。我在下面复制了一小部分说明:

文档中的短语“ ISO 8601格式”是指一种指定按星期和天数分解的日期而不是传统的月份和日期。始终采用这种格式的年份从星期一开始,所以在12月31日不是星期日的年份,ISO 8601日历将其视为来年的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.