Definition
$dateFromPartsConstructs and returns a Date object given the date's constituent properties.
The
$dateFromPartsexpression has the following syntax:{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } You can also specify your constituent date fields in ISO week date format using the following syntax:
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } The
$dateFromPartstakes a document with the following fields:Important
You cannot combine the use of calendar dates and ISO week date fields when constructing your
$dateFromPartsinput document.FieldRequired/OptionalDescriptionyearRequired if not using
isoWeekYearCalendar year. Can be any expression that evaluates to a number.
Value range:
If the number specified is outside this range,1-9999$dateFromPartserrors. The lower bound for this value is1.isoWeekYearRequired if not using
yearISO Week Date Year. Can be any expression that evaluates to a number.
Value range:
If the number specified is outside this range,1-9999$dateFromPartserrors. The lower bound for this value is1.monthOptional. Can only be used with
year.Month. Can be any expression that evaluates to a number.
Defaults to
1.Value range:
If the number specified is outside this range,1-12$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.isoWeekOptional. Can only be used with
isoWeekYear.Week of year. Can be any expression that evaluates to a number.
Defaults to
1.Value range:
If the number specified is outside this range,1-53$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.dayOptional. Can only be used with
year.Day of month. Can be any expression that evaluates to a number.
Defaults to
1.Value range:
If the number specified is outside this range,1-31$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.isoDayOfWeekOptional. Can only be used with
isoWeekYear.Day of week (Monday
1- Sunday7). Can be any expression that evaluates to a number.Defaults to
1.Value range:
If the number specified is outside this range,1-7$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.hourOptional
Hour. Can be any expression that evaluates to a number.
Defaults to
0.Value range:
If the number specified is outside this range,0-23$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.minuteOptional
Minute. Can be any expression that evaluates to a number.
Defaults to
0.Value range:
0-59If the number specified is outside this range,$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.secondOptional
Second. Can be any expression that evaluates to a number.
Defaults to
0.Value range:
If the number specified is outside this range,0-59$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.millisecondOptional
Millisecond. Can be any expression that evaluates to a number.
Defaults to
0.Value range:
If the number specified is outside this range,0-999$dateFromPartsincorporates the difference in the date calculation. See Value Range for examples.timezoneOptional
<timezone>can be any expression that evaluates to a string whose value is either: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".
For more information on expressions, see Expressions.
Behavior
Value Range
The supported value range for year and isoWeekYear is 1-9999.
If the value specified for fields other than year, isoWeekYear,
and timezone is outside the valid range, $dateFromParts
carries or subtracts the difference from other date parts to calculate
the date.
Value is Greater than the Range
Consider the following $dateFromParts expression where
the month field value is 14, which is 2 months greater than the
maximum value of 12 months(or 1 year):
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }
The expression calculates the date by increasing the year by 1
and setting the month to 2 to return:
ISODate("2018-02-01T12:00:00Z")
Value is Less than the Range
Consider the following $dateFromParts expression where
the month field value is 0, which is 1 month less than the
minimum value of 1 month:
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12 } }
The expression calculates the date by decreasing the year by 1
and setting the month to 12 to return:
ISODate("2016-12-01T12:00:00Z")
Time Zone
When using an Olson Timezone Identifier in the <timezone>
field, MongoDB applies the DST offset
if applicable for the specified timezone.
For example, consider a sales collection with the following document:
db.sales.insertOne( { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") } )
The following aggregation illustrates how MongoDB handles the DST
offset for the Olson Timezone Identifier. The example uses the
$hour and $minute operators to return the
corresponding portions of the date field:
db.sales.aggregate([ { $project: { "nycHour": { $hour: { date: "$date", timezone: "-05:00" } }, "nycMinute": { $minute: { date: "$date", timezone: "-05:00" } }, "gmtHour": { $hour: { date: "$date", timezone: "GMT" } }, "gmtMinute": { $minute: { date: "$date", timezone: "GMT" } }, "nycOlsonHour": { $hour: { date: "$date", timezone: "America/New_York" } }, "nycOlsonMinute": { $minute: { date: "$date", timezone: "America/New_York" } } } }])
The operation returns the following result:
{ "_id": 1, "nycHour" : 5, "nycMinute" : 24, "gmtHour" : 10, "gmtMinute" : 24, "nycOlsonHour" : 6, "nycOlsonMinute" : 24 }
Example
The following aggregation uses $dateFromParts to
construct three date objects from the provided input fields:
db.sales.aggregate([ { $project: { date: { $dateFromParts: { 'year' : 2017, 'month' : 2, 'day': 8, 'hour' : 12 } }, date_iso: { $dateFromParts: { 'isoWeekYear' : 2017, 'isoWeek' : 6, 'isoDayOfWeek' : 3, 'hour' : 12 } }, date_timezone: { $dateFromParts: { 'year' : 2016, 'month' : 12, 'day' : 31, 'hour' : 23, 'minute' : 46, 'second' : 12, 'timezone' : 'America/New_York' } } } }])
The operation returns the following result:
{ "_id" : 1, "date" : ISODate("2017-02-08T12:00:00Z"), "date_iso" : ISODate("2017-02-08T12:00:00Z"), "date_timezone" : ISODate("2017-01-01T04:46:12Z") }