Database Manual / Reference / Query Language / Expressions

$dateFromString (aggregation operator)(聚合运算符)

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描述
dateString

The date/time string to convert to a date object. See Date() for more information on date/time formats.要转换为日期对象的日期/时间字符串。有关日期/时间格式的更多信息,请参阅Date()

If specifying the timezone option to the operator, do not include time zone information in the dateString.如果向运算符指定timezone选项,请不要在dateString中包含时区信息。

format

Optional. 可选。The date format specification of the dateString. The format can be any expression that evaluates to a string literal, containing 0 or more format specifiers. dateString的日期格式规范。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

timezone

Optional. 可选。The time zone to use to format the date.用于格式化日期的时区。

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,例如"+04:45",或者
    • +/-[hh][mm], e.g. "-0530", or,例如"-0530",或者
    • +/-[hh], e.g. "+03", or,例如"+03",或者
  • The strings "Z", "UTC", or "GMT"字符串"Z""UTC""GMT"

For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式

onError

Optional. 可选。If $dateFromString encounters an error while parsing the given dateString, it outputs the result value of the provided onError expression. This result value can be of any type.如果$dateFromString在解析给定的dateString时遇到错误,它将输出提供的onError表达式的结果值。此结果值可以是任何类型。

If you do not specify onError, $dateFromString throws an error if it cannot parse dateString.如果不指定onError,如果$dateFromString无法解析dateString,则会抛出错误。

onNull

Optional. 可选。If the dateString provided to $dateFromString is null or missing, it outputs the result value of the provided onNull expression. This result value can be of any type.如果提供给$dateFromStringdateStringnull或缺失,它将输出提供的onNull表达式的结果值。此结果值可以是任何类型。

If you do not specify onNull and dateString is null or missing, then $dateFromString outputs null.如果不指定onNull,并且dateStringnull或缺失,则$dateFromString输出null

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)缩写月份(3个字母)jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
%BFull month name完整月份名称january-december
%dDay of month (2 digits, zero padded)月份中的第几天(2位数字,零填充)01-31
%GYear in ISO 8601 formatISO 8601格式的年份0000-9999
%HHour (2 digits, zero padded, 24-hour clock)小时(2位数字,加零,24小时制)00-23
%jDay of year (3 digits, zero padded)一年中的第几天(3位数字,零填充)001-366
%LMillisecond (3 digits, zero padded)毫秒(3位数字,零填充)000-999
%mMonth (2 digits, zero padded)月份(2位数字,零填充)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. For example, if the timezone offset (+/-[hhmm]) was +0445, the minutes offset is +285.UTC的分钟偏移量为数字。例如,如果时区偏移量(+/-[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. For example:timezone参数也可以通过文档字段而不是硬编码参数提供。例如:

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.如果集合包含具有不可解析日期字符串的文档,除非您为可选的onError参数提供聚合表达式,否则$dateFromString将抛出错误。

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的文档,除非您为可选的onNull参数提供聚合表达式,否则$dateFromString将返回null

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纪元的日期,而不是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") }