Definición
$dateFromPartsConstruye y devuelve un objeto Date dada las propiedades constitutivas de la fecha.
La
$dateFromPartsLa expresión tiene la siguiente sintaxis:{ $dateFromParts : { 'year': <year>, 'month': <month>, 'day': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } También se pueden especificar los campos de fecha constituyentes en fecha ISO de la semana dé formato usando la siguiente sintaxis:
{ $dateFromParts : { 'isoWeekYear': <year>, 'isoWeek': <week>, 'isoDayOfWeek': <day>, 'hour': <hour>, 'minute': <minute>, 'second': <second>, 'millisecond': <ms>, 'timezone': <tzExpression> } } El
$dateFromPartsprocesa un documento con los siguientes campos:Importante
No puedes combinar el uso de fechas del calendario y campos de fechas semanales ISO al construir tu documento de entrada
$dateFromParts.CampoObligatorio/OpcionalDescripciónyearObligatorio si no se utiliza
isoWeekYearAño calendario. Puede ser cualquier expresión que evalúa a un número.
Rango de valores:
Si el número especificado está fuera de este rango,1-9999$dateFromPartserrores. El límite inferior para este valor es1.isoWeekYearObligatorio si no se utiliza
yearAño de fecha de semana ISO. Puede ser cualquier expresión que devuelva un número.
Rango de valores:
Si el número especificado está fuera de este rango,1-9999$dateFromPartserrores. El límite inferior para este valor es1.monthOpcional. Solo se puede utilizar 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:
Si el número especificado queda fuera de este rango,1-12$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.isoWeekOpcional. Solo se puede utilizar con
isoWeekYear.Semana del año. Puede ser cualquier expresión que dé como resultado un número.
Se establece por defecto en
1.Rango de valores:
Si el número especificado queda fuera de este rango,1-53$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.dayOpcional. Solo se puede utilizar 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:
Si el número especificado queda fuera de este rango,1-31$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.isoDayOfWeekOpcional. Solo se puede utilizar 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:
Si el número especificado queda fuera de este rango,1-7$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.hourOpcional
Hora. Puede ser cualquier expresión que se evalúe como un número.
Se establece por defecto en
0.Rango de valores:
Si el número especificado queda fuera de este rango,0-23$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.minuteOpcional
Minuto. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
0-59Si el número especificado está fuera de este rango,$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ver ejemplos.secondOpcional
Segundo. Puede ser cualquier expresión que evalúe un número.
Se establece por defecto en
0.Rango de valores:
Si el número especificado queda fuera de este rango,0-59$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.millisecondOpcional
Milisegundo. Puede ser cualquier expresión que devuelva un número.
Se establece por defecto en
0.Rango de valores:
Si el número especificado queda fuera de este rango,0-999$dateFromPartsincorpora la diferencia en el cálculo de la fecha. Consulta Rango de valores para ejemplos.timezoneOpcional
<timezone>puede ser cualquier expresión que evalúe una cadena cuyo valor sea: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 que no sean year, isoWeekYear o 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 $dateFromParts donde el valor del campo month es 14, 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 year en 1 y estableciendo month en 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 Desplazamiento del horario de verano, 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 usa $dateFromParts para construir tres objetos de fecha a partir de los campos de entrada 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") }