Convertir un fecha tipo string a formato ISODate de MongoDB

publicado por: Anonymous

Necesito almacenar las fechas contenidas en un objeto JSON en un formato que me asegure que será válido en cualquier escenario que se usen y el formato elegido es ISODate.

Inicialmente intenté crear un objeto Date() y la función .toISOString() para mi objeto, pero los resultados no son correctos:

  • Si tengo una fecha como 02/01/2017 08:09:45 AM que corresponde a (02 de enero de 2017), pasa lo siguiente:

    • Si uso new Date(tramite.fecha_tramite) obtengo Wed Feb 01 2017 08:09:45 GMT-0600 (CST)
    • Si uso new Date(tramite.fecha_tramite).toISOString() el resultado es 2017-02-01T14:09:45.000Z
  • Si tengo una fecha como 23/06/2017 02:58:36 PM (6 de junio de 2017) entonces obtengo un error:

    Invalid Date
    /Volumes/datos/Proyectos/convertir-tramites/index.js:40
        console.log(`${new Date(tramite.fecha_afecta_ln).toISOString()}`)
                                                         ^
    
    RangeError: Invalid time value
    

Lo que necesito es convertir 02/01/2017 08:09:45 AM en 2017-01-02T14:09:45.000Z.

Este es un objeto JSON típico con el que hago pruebas:

{
    "FOLIO": "1738163100007",
    "estatus": "ENTREGADA",
    "causa_rechazo": "",
    "mov_solicitado": "CAMBIO DE DOMICILIO",
    "mov_definitivo": "CAMBIO DE DOMICILIO",
    "fecha_tramite": "02/01/2017 08:32:47 AM",
    "fecha_rec_cecyrd": "02/01/2017 08:42:40 AM",
    "fecha_reg_cecyrd": "02/01/2017 10:09:19 AM",
    "fecha_cancelado_mac": "",
    "fecha_rechazado": "",
    "fecha_cancelado_mov_post": "",
    "fecha_alta_pe": "02/01/2017 10:09:43 AM",
    "fecha_actual_pe": "02/01/2017 10:09:41 AM",
    "fecha_reinc_pe": "",
    "fecha_existoso": "02/01/2017 10:09:43 AM",
    "fecha_lote_prod": "02/01/2017 05:01:56 PM",
    "fecha_listo_reimp": "",
    "fecha_cpv_creada": "02/01/2017 05:01:42 PM",
    "fecha_registrada_mac": "09/01/2017 09:35:05 AM",
    "fecha_disponible": "09/01/2017 09:49:48 AM",
    "fecha_entregada": "23/01/2017 10:59:51 AM",
    "fecha_afecta_ln": "23/01/2017 02:58:36 PM"
}

Y con estos son mis experimentos:

console.log(`La fecha pelona: ${tramite.fecha_tramite}`)
console.log(`Usando solo Date(): ${new Date(tramite.fecha_tramite)}`)
console.log(`Usando Date().toISOString(): ${new Date(tramite.fecha_tramite).toISOString()}`)

En Python puedo usar la función strftime, pero usando JavaScript y node, ¿cómo podría convertir una fecha tipo string a un objeto con el formato requerido?

solución

Como bien dice Gustavo, la mejor solución es MomentJS. Si bien SIEMPRE es mejor optar por una solución vanilla JS, en el caso de las fechas (sobre todo para las fechas en formato no-USA) esta es la mejor opción. En Node y usando node-moment (wrapper de Node para moment()):

const moment = require('node-moment');

//"fecha_alta_pe": "02javascript:void(0)/01/2017 10:09:43 AM"
console.log('Fecha ISO : ' + moment('02/01/2017 10:09:43 AM').toISOString());
//output -> 2017-02-01T10:09:43.000Z

Por supuesto debes primero instalar Moment via npm install node-moment --save-dev si quieres usar simplemente moment() (en una página web) puedes bajar MomentJS desde su sitio oficial.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *