$dateFromString (聚合)
定义
$dateFromString将日期/时间字符串转换为日期对象。
以下
$dateFromString表达式具有以下语法{ $dateFromString: { dateString: <dateStringExpression>, format: <formatStringExpression>, timezone: <tzExpression>, onError: <onErrorExpression>, onNull: <onNullExpression> } } $dateFromString接收以下字段的文档字段描述dateString要转换为日期对象的日期/时间字符串。有关日期/时间格式的更多信息,请参阅
Date()如果指定操作符的
timezone选项,则不要在dateString中包含时区信息。format可选。指定
dateString的日期格式。此format可以是任何评估为字符串字面量的表达式,包含 0 或多个格式说明符。有关可用说明符的列表,请参阅格式说明符。如果没有指定,则
$dateFromString使用默认格式"%Y-%m-%dT%H:%M:%S.%LZ",但接受各种格式并尝试解析dateString。timezone可选。用于格式化日期的时区。
如果
dateString参数的格式类似于 '2017-02-08T12:10:40.787Z',其中结尾的 'Z' 表示 Zulu 时间(UTC 时区),则不能指定timezone参数。<timezone>允许以下选项和表达式评估为它们一个Olson时区标识符,例如
"Europe/London"或"America/New_York",或者以以下形式的UTC偏移量
+/-[hh]:[mm],例如"+04:45",或者+/-[hh][mm],例如"-0530",或者+/-[hh],例如"+03",或者
字符串
"Z"、"UTC"或"GMT"
有关表达式的更多信息,请参阅表达式运算符。
onError可选。如果
$dateFromString在解析给定的dateString时遇到错误,则输出提供的onError表达式的结果值。此结果值可以是任何类型。如果您未指定
onError,并且$dateFromString无法解析dateString,则它将抛出一个错误。onNull可选。如果提供给
$dateFromString的dateString是null或缺失,则输出提供的onNull表达式的结果值。此结果值可以是任何类型。如果您未指定
onNull并且dateString是null或缺失,则$dateFromString输出null。
行为
示例 | 结果 | ||||
|---|---|---|---|---|---|
| ISODate("2017-02-08T12:10:40.787Z") | ||||
| ISODate("2017-02-08T17:10:40.787Z") | ||||
| ISODate("2017-02-08T00:00:00Z") | ||||
| ISODate("2020-10-20T00:00:00.000Z") | ||||
| ISODate("2018-06-15T00:00:00Z") | ||||
| ISODate("2018-06-15T00:00:00Z") | ||||
| ISODate("1996-01-31T08:35:28.000Z") |
格式说明符
以下格式说明符可用于 <formatString> 中
说明符 | 描述 | 可能值 |
|---|---|---|
%b | 缩写月份(3个字母) | jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec |
%B | 完整月份名称 | january - december |
%d | 月份中的天数(2位数字,前导零) | 01-31 |
%G | ISO 8601 格式的年份 | 0000-9999 |
%H | 小时(2位数字,前导零,24小时制) | 00-23 |
%j | 年份中的天数(3位数字,前导零) | 001-366 |
%L | 毫秒(3位数字,前导零) | 000-999 |
%m | 月份(2位数字,前导零) | 01-12 |
%M | 分钟(2位数字,前导零) | 00-59 |
%S | 秒(2位数字,前导零) | 00-60 |
%u | ISO 8601 格式的星期数(1-星期一,7-星期天) | 1-7 |
%U | 年份中的周数(2位数字,前导零) | 00-53 |
%V | ISO 8601 格式的年份中的周数 | 1-53 |
%w | 星期作为整数(0-星期天,6-星期六) | 0-6 |
%Y | 年份(4位数字,前导零) | 0000-9999 |
%z | UTC 时间偏移量。 | +/-[hh][mm] |
%Z | UTC 偏移量作为数字。例如,如果时间偏移量( +/-[hhmm])为 +0445,则分钟偏移量为 +285。 | +/-mmm |
%% | 百分比字符作为文本 | % |
示例
日期转换
考虑一个包含以下日期的文档集合 logmessages。
{ _id: 1, date: "2017-02-08T12:10:40.787", timezone: "America/New_York", message: "Step 1: Started" }, { _id: 2, date: "2017-02-08", timezone: "-05:00", message: "Step 1: Ended" }, { _id: 3, message: " Step 1: Ended " }, { _id: 4, date: "2017-02-09", timezone: "Europe/London", message: "Step 2: Started"}, { _id: 5, date: "2017-02-09T03:35:02.055", timezone: "+0530", message: "Step 2: In Progress"}
以下聚合使用 $dateFromString 将 date 值转换为日期对象
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: 'America/New_York' } } } } ] )
上述聚合返回以下文档,并将每个 date 字段转换为东部时区
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T05:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-09T08:35:02.055Z") }
timezone 参数也可以通过文档字段而不是硬编码的参数提供。例如
db.logmessages.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone' } } } } ] )
上述聚合返回以下文档,并将每个 date 字段转换为它们各自的 UTC 表示形式。
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("2017-02-08T05:00:00Z") } { "_id" : 3, "date" : null } { "_id" : 4, "date" : ISODate("2017-02-09T00:00:00Z") } { "_id" : 5, "date" : ISODate("2017-02-08T22:05:02.055Z") }
onError
如果您的集合包含包含不可解析日期字符串的文档,则除非您为可选的 onError 参数提供一个聚合表达式,否则 $dateFromString 会引发错误。
例如,给定一个包含以下文档的集合 dates
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : "20177-02-09T03:35:02.055", timezone: "America/New_York" }
您可以使用 onError 参数返回无效日期的原始字符串形式
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onError: '$date' } } } } ] )
此函数返回以下文档
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : "20177-02-09T03:35:02.055" }
onNull
如果您的集合包含具有 null 日期字符串的文档,除非您向可选的 onNull 参数提供一个 聚合表达式,否则 $dateFromString 返回 null。
例如,给定一个包含以下文档的集合 dates
{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" }, { "_id" : 2, "date" : null, timezone: "America/New_York" }
您可以使用 onNull 参数,让 $dateFromString 返回代表 Unix纪元 的日期,而不是 null。
db.dates.aggregate( [ { $project: { date: { $dateFromString: { dateString: '$date', timezone: '$timezone', onNull: new Date(0) } } } } ] )
此函数返回以下文档
{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") } { "_id" : 2, "date" : ISODate("1970-01-01T00:00:00Z") }