Definición
$dateFromPartsConstruye y devuelve un objeto Date dada las propiedades constitutivas de la fecha.
La expresión tiene la siguiente
$dateFromPartssintaxis:{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } También puedes especificar tus campos de fecha constituyentes en fecha de semana ISO formato usando la siguiente sintaxis:
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } El toma un documento con los siguientes
$dateFromPartscampos:Importante
No puede combinar el uso de fechas de calendario y campos de fecha de semana ISO al construir su documento de
$dateFromPartsentrada.CampoObligatorio/OpcionalDescripciónyearObligatorio si no se utiliza
isoWeekYearAño calendario. Puede ser cualquier expresión que devuelva un número.
Rango de valores:
1-9999isoWeekYearObligatorio si no se utiliza
yearAño de fecha de semana ISO. Puede ser cualquier expresión que devuelva un número.
Rango de valores:
1-9999monthopcional. Solo se puede usar con
year.Mes. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
1.Rango de valores:
1-12isoWeekopcional. Solo se puede usar con
isoWeekYear.Semana del año. Puede ser cualquier expresión que se evalúe en un número.
Se establece por defecto en
1.Rango de valores:
1-53dayopcional. Solo se puede usar con
year.Día del mes. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
1.Rango de valores:
1-31isoDayOfWeekopcional. Solo se puede usar con
isoWeekYear.Día de la semana (lunes
1- domingo7). Puede ser cualquier expresión que evalúe a un número.Se establece por defecto en
1.Rango de valores:
1-7hourOpcional
Hora. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
0.Rango de valores:
0-23minuteOpcional
Minuto. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
0-59Rango de valoressecondOpcional
Segundo. Puede ser cualquier expresión que se evalúe en un número.
Se establece por defecto en
0.Rango de valores:
0-59millisecondOpcional
Milisegundo. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
0-999timezoneOpcional
<timezone>puede ser cualquier expresión que se evalúe a una string cuyo valor sea uno de los siguientes:un identificador de zona horaria de Olson, como
"Europe/London""America/New_York"o, oun desplazamiento UTC en la forma:
+/-[hh]:[mm]por ejemplo,"+04:45", o+/-[hh][mm]por ejemplo,"-0530", o+/-[hh], e.g."+03".
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Rango de valores
El rango de valores admitidos para year y isoWeekYear es 1-9999.
Si el valor especificado para campos distintos year isoWeekYearde, y timezone está fuera del rango válido, $dateFromParts lleva o resta la diferencia de otras partes de la fecha para calcular la fecha.
El valor es mayor que el rango
Considere la siguiente expresión donde $dateFromParts el month valor del campo 14 es, que es 2 meses mayor que el valor máximo de 12 meses (o 1 año):
{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }
La expresión calcula la fecha aumentando el year en 1 y estableciendo el month en 2 para devolver:
ISODate("2018-02-01T12:00:00Z")
El valor es menor que el rango
Considere la siguiente expresión donde $dateFromParts el month valor del campo 0 es, que es 1 mes menos que el valor mínimo de 1 mes:
{ $dateFromParts: { 'year' : 2017, 'month' : 0, 'day': 1, 'hour' : 12 } }
La expresión calcula la fecha disminuyendo el year en 1 y ajustando el month a 12 para devolver:
ISODate("2016-12-01T12:00:00Z")
Zona horaria
Al utilizar un identificador de zona horaria de Olson en el campo <timezone>, MongoDB aplica el horario de verano (DST) si corresponde para la zona horaria especificada.
Por ejemplo, considera una colección sales con el siguiente documento:
db.sales.insertOne( { "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:15:39.736Z") } )
La siguiente agregación ilustra cómo MongoDB gestiona el ajuste de DST para el identificador de zona horaria Olson. El ejemplo usa los operadores $hour y $minute para devolver las partes correspondientes del campo date:
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" } } } }])
La operación devuelve el siguiente resultado:
{ "_id": 1, "nycHour" : 5, "nycMinute" : 24, "gmtHour" : 10, "gmtMinute" : 24, "nycOlsonHour" : 6, "nycOlsonMinute" : 24 }
Ejemplo
La siguiente agregación utiliza para construir tres objetos de fecha a partir de los campos de entrada $dateFromParts proporcionados:
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' } } } }])
La operación devuelve el siguiente resultado:
{ "_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") }