文档菜单
文档首页
/
MongoDB 手册
/ / /

$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

可选。如果提供给$dateFromStringdateStringnull或缺失,则输出提供的onNull 表达式的结果值。此结果值可以是任何类型。

如果您未指定onNull并且dateStringnull或缺失,则$dateFromString输出null

提示

另请参阅

示例
结果
{ $dateFromString: {
dateString: "2017-02-08T12:10:40.787"
} }
ISODate("2017-02-08T12:10:40.787Z")
{ $dateFromString: {
dateString: "2017-02-08T12:10:40.787",
timezone: "America/New_York"
} }
ISODate("2017-02-08T17:10:40.787Z")
{ $dateFromString: {
dateString: "2017-02-08"
} }
ISODate("2017-02-08T00:00:00Z")
{ $dateFromString: {
dateString: "oct 20 2020"
} }
ISODate("2020-10-20T00:00:00.000Z")
{ $dateFromString: {
dateString: "06-15-2018",
format: "%m-%d-%Y"
} }
ISODate("2018-06-15T00:00:00Z")
{ $dateFromString: {
dateString: "15-06-2018",
format: "%d-%m-%Y"
} }
ISODate("2018-06-15T00:00:00Z")
{ $dateFromString: {
dateString: "WED jan 31 12:05:28 +03:30 1996"
} }
ISODate("1996-01-31T08:35:28.000Z")

以下格式说明符可用于 <formatString>

说明符
描述
可能值
%b
缩写月份(3个字母)
janfebmaraprmayjunjulaugsepoctnovdec
%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 参数提供一个聚合表达式,否则 $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" }

如果您的集合包含具有 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") }

返回

从部分创建日期