Docs HomeMongoDB Manual

$dateFromString (aggregation)

Definition定义

$dateFromString

Converts a date/time string to a date object.将日期/时间字符串转换为日期对象。

The $dateFromString expression has the following syntax:$dateFromString表达式具有以下语法:

{ $dateFromString: {
dateString: <dateStringExpression>,
format: <formatStringExpression>,
timezone: <tzExpression>,
onError: <onErrorExpression>,
onNull: <onNullExpression>
} }

The $dateFromString takes a document with the following fields:$dateFromString接受一个具有以下字段的文档:

Field字段Description描述
dateStringThe date/time string to convert to a date object. 要转换为日期对象的日期/时间字符串。See Date() for more information on date/time formats. 有关日期/时间格式的详细信息,请参阅Date()
Note
If specifying the timezone option to the operator, do not include time zone information in the dateString. 如果为运算符指定timezone选项,请不要在dateString中包含时区信息。
formatOptional.可选的。The date format specification of the dateString. dateString的日期格式规范。The format can be any expression that evaluates to a string literal, containing 0 or more format specifiers. format可以是任何计算结果为字符串文字的表达式,其中包含0个或多个格式说明符。For a list of specifiers available, see Format Specifiers.有关可用说明符的列表,请参阅格式说明符
If unspecified, $dateFromString uses "%Y-%m-%dT%H:%M:%S.%LZ" as the default format but accepts a variety of formats and attempts to parse the dateString if possible. 如果未指定,$dateFromString将使用"%Y-%m-%dT%H:%M:%S.%LZ"作为默认格式,但接受多种格式,并在可能的情况下尝试解析dateString
timezoneOptional.可选的。The time zone to use to format the date. 用于设置日期格式的时区。
Note
If the dateString argument is formatted like '2017-02-08T12:10:40.787Z', in which the 'Z' at the end indicates Zulu time (UTC time zone), you cannot specify the timezone argument. 如果dateString参数的格式类似'2017-02-08T12:10:40.787Z',其中末尾的'Z'表示祖鲁时间(UTC时区),则无法指定时区参数。
<timezone> allows for the following options and expressions that evaluate to them: 允许以下选项和计算结果为它们的表达式:
  • an Olson Timezone Identifier, such as "Europe/London" or "America/New_York", or奥尔森时区标识符,如"Europe/London""America/New_York",或
  • a UTC offset in the form: UTC偏移量,格式为:
    • +/-[hh]:[mm], e.g. "+04:45", or
    • +/-[hh][mm], e.g. "-0530", or
    • +/-[hh], e.g. "+03", or
  • The strings "Z", "UTC", or "GMT"字符串"Z""UTC""GMT"
For more information on expressions, see Expressions. 有关表达式的详细信息,请参阅表达式
onErrorOptional.可选的。If $dateFromString encounters an error while parsing the given dateString, it outputs the result value of the provided onError expression. 如果$dateFromString在解析给定的dateString时遇到错误,它将输出所提供的onError表达式的结果值。This result value can be of any type.此结果值可以是任何类型。
If you do not specify onError, $dateFromString throws an error if it cannot parse dateString. 如果未指定onError$dateFromString在无法解析dateString时会抛出错误。
onNullOptional.可选的。If the dateString provided to $dateFromString is null or missing, it outputs the result value of the provided onNull expression. 如果提供给$dateFromStringdateStringnull或缺失,它将输出提供的onNull表达式的结果值。This result value can be of any type.此结果值可以是任何类型。
If you do not specify onNull and dateString is null or missing, then $dateFromString outputs null. 如果未指定onNull,并且dateStringnull或缺失,则$dateFromString输出null
Tip

See also: 另请参阅:

Behavior行为

Example示例Results结果
{ $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")

Format Specifiers格式规范

The following format specifiers are available for use in the <formatString>:以下格式说明符可用于<formatString>

Specifiers标识符Description描述Possible Values可能的值
%bAbbreviated month (3 letters)jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
%BFull month namejanuary-december
%dDay of month (2 digits, zero padded)01-31
%GYear in ISO 8601 format0000-9999
%HHour (2 digits, zero padded, 24-hour clock)00-23
%jDay of year (3 digits, zero padded)001-366
%LMillisecond (3 digits, zero padded)000-999
%mMonth (2 digits, zero padded)01-12
%MMinute (2 digits, zero padded)分钟(2位,零填充)00-59
%SSecond (2 digits, zero padded)秒(2位,零填充)00-60
%uDay of week number in ISO 8601 format (1-Monday, 7-Sunday)ISO 8601格式的星期几编号(1个星期日,7个星期日)1-7
%UWeek of year (2 digits, zero padded)一年中的一周(2位数,零填充)00-53
%VWeek of Year in ISO 8601 formatISO 8601格式的一年中的一周1-53
%wDay of week as an integer (0-Sunday, 6-Saturday)一周中的某一天为整数(0周日,6周六)0-6
%YYear (4 digits, zero padded)年份(4位,零填充)0000-9999
%zThe timezone offset from UTC.时区与UTC的偏移量。+/-[hh][mm]
%ZThe minutes offset from UTC as a number. 从UTC偏移的分钟数。For example, if the timezone offset (+/-[hhmm]) was +0445, the minutes offset is +285.+/-mmm例如,如果时区偏移量(+/-hhmm])为+0445,则分钟偏移量为+285+/-mmm
%%Percent Character as a Literal文字字符百分比%

Examples实例

Converting Dates转换日期

Consider a collection logmessages that contains the following documents with dates.考虑一个包含以下带日期的文档的集合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"}

The following aggregation uses $dateFromString to convert the date value to a date object:以下聚合使用$dateFromStringdate值转换为日期对象:

db.logmessages.aggregate( [ {
$project: {
date: {
$dateFromString: {
dateString: '$date',
timezone: 'America/New_York'
}
}
}
} ] )

The above aggregation returns the following documents and converts each date field to the Eastern Time Zone:上述聚合返回以下文档,并将每个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") }

The timezone argument can also be provided through a document field instead of a hard coded argument. timezone参数也可以通过文档字段而不是硬编码参数来提供。For example:例如:

db.logmessages.aggregate( [ {
$project: {
date: {
$dateFromString: {
dateString: '$date',
timezone: '$timezone'
}
}
}
} ] )

The above aggregation returns the following documents and converts each date field to their respective UTC representations.上述聚合返回以下文档,并将每个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

If your collection contains documents with unparsable date strings, $dateFromString throws an error unless you provide an aggregation expression to the optional onError parameter.如果您的集合包含具有不可解析日期字符串的文档,$dateFromString将抛出错误,除非您为可选的onError参数提供聚合表达式

For example, given a collection dates with the following documents:例如,给定具有以下文档的集合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" }

You can use the onError parameter to return the invalid date in its original string form:您可以使用onError参数以原始字符串形式返回无效日期:

db.dates.aggregate( [ {
$project: {
date: {
$dateFromString: {
dateString: '$date',
timezone: '$timezone',
onError: '$date'
}
}
}
} ] )

This returns the following documents:这将返回以下文档:

{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") }
{ "_id" : 2, "date" : "20177-02-09T03:35:02.055" }

onNull

If your collection contains documents with null date strings, $dateFromString returns null unless you provide an aggregation expression to the optional onNull parameter.如果集合包含日期字符串为null的文档,$dateFromString将返回null,除非为可选的onNull参数提供聚合表达式

For example, given a collection dates with the following documents:例如,给定具有以下文档的集合dates

{ "_id" : 1, "date" : "2017-02-08T12:10:40.787", timezone: "America/New_York" },
{ "_id" : 2, "date" : null, timezone: "America/New_York" }

You can use the onNull parameter to have $dateFromString return a date representing the unix epoch instead of null:您可以使用onNull参数让$dateFromString返回一个表示unix epoch的日期,而不是null

db.dates.aggregate( [ {
$project: {
date: {
$dateFromString: {
dateString: '$date',
timezone: '$timezone',
onNull: new Date(0)
}
}
}
} ] )

This returns the following documents:这将返回以下文档:

{ "_id" : 1, "date" : ISODate("2017-02-08T17:10:40.787Z") }
{ "_id" : 2, "date" : ISODate("1970-01-01T00:00:00Z") }