Definition
$dateFromStringConverts a date/time string to a date object.
The
$dateFromStringexpression has the following syntax:{ $dateFromString: { dateString: <dateStringExpression>, format: <formatStringExpression>, timezone: <tzExpression>, onError: <onErrorExpression>, onNull: <onNullExpression> } } The
$dateFromStringtakes a document with the following fields:FieldDescriptiondateStringThe date/time string to convert to a date object. See
Date()for more information on date/time formats.If specifying the
timezoneoption to the operator, do not include time zone information in thedateString.formatOptional. The date format specification of the
dateString. Theformatcan be any expression that evaluates to a string literal, containing 0 or more format specifiers. For a list of specifiers available, see Format Specifiers.If unspecified,
$dateFromStringuses"%Y-%m-%dT%H:%M:%S.%LZ"as the default format but accepts a variety of formats and attempts to parse thedateStringif possible.timezoneOptional. The time zone to use to format the date.
If the
dateStringargument 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 thetimezoneargument.<timezone>allows for the following options and expressions that evaluate to them:an Olson Timezone Identifier, such as
"Europe/London"or"America/New_York", ora UTC offset in the form:
+/-[hh]:[mm], e.g."+04:45", or+/-[hh][mm], e.g."-0530", or+/-[hh], e.g."+03", or
The strings
"Z","UTC", or"GMT"
For more information on expressions, see Expressions.
onErrorOptional. If
$dateFromStringencounters an error while parsing the givendateString, it outputs the result value of the providedonErrorexpression. This result value can be of any type.If you do not specify
onError,$dateFromStringthrows an error if it cannot parsedateString.onNullOptional. If the
dateStringprovided to$dateFromStringisnullor missing, it outputs the result value of the providedonNullexpression. This result value can be of any type.If you do not specify
onNullanddateStringisnullor missing, then$dateFromStringoutputsnull.
Behavior
Example | Results | ||||
|---|---|---|---|---|---|
|
| ||||
|
| ||||
|
| ||||
|
| ||||
|
| ||||
|
| ||||
|
|
Format Specifiers
The following format specifiers are available for use in the
<formatString>:
Specifiers | Description | Possible Values |
|---|---|---|
| Abbreviated month (3 letters) |
|
| Full month name |
|
| Day of month (2 digits, zero padded) |
|
| Year in ISO 8601 format |
|
| Hour (2 digits, zero padded, 24-hour clock) |
|
| Day of year (3 digits, zero padded) |
|
| Millisecond (3 digits, zero padded) |
|
| Month (2 digits, zero padded) |
|
| Minute (2 digits, zero padded) |
|
| Second (2 digits, zero padded) |
|
| Day of week number in ISO 8601 format (1-Monday, 7-Sunday) |
|
| Week of year (2 digits, zero padded) |
|
| Week of Year in ISO 8601 format |
|
| Day of week as an integer (0-Sunday, 6-Saturday) |
|
| Year (4 digits, zero padded) |
|
| The timezone offset from UTC. |
|
| The minutes offset from UTC as a number. For example, if the
timezone offset ( |
|
| Percent Character as a Literal |
|
Examples
Converting Dates
Consider a collection logmessages that contains the following
documents with dates.
{ _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:
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:
{ "_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:
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.
{ "_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.
For example, given a collection dates with the following
documents:
{ "_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:
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.
For example, given a collection dates with the following
documents:
{ "_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:
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") }