Decir que tengo un objeto datetime por ejemplo DateTime.now. Quiero fijar las horas y los minutos a 0 (medianoche). ¿Cómo puedo hacer eso?

4 Comentarios

  1. 204

    Dentro de un entorno de Rails:

    Gracias a ActiveSupport puede utilizar:

    DateTime.now.midnight
    DateTime.now.beginning_of_day

    O

    DateTime.now.change({ hour: 0, min: 0, sec: 0 })
    
    # More concisely
    DateTime.now.change({ hour: 0 })                

    Dentro de una puramente Ruby medio ambiente:

    now = DateTime.now
    DateTime.new(now.year, now.month, now.day, 0, 0, 0, now.zone)

    O

    now = DateTime.now
    DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))
    • FWIW, el método de cambio es parte de rails ruby no. Las opciones de tiempo (hora, minuto, segundo) restablecer cascadingly, así que si sólo la hora se pasa, a continuación, minuto y segundo es establecer a 0. Si la hora y los minutos se pasa, a continuación, sec se establece en 0.
    • Ser conscientes de que DateTime.ahora.medianoche no retorno 24:00:00 como se podría esperar, devuelve 00:00:00 – el mismo valor como beginning_of_day. Ver mi respuesta de por qué esto podría ser importante en algunos casos.
    • No usar DateTime. Consulte gist.github.com/pixeltrix/e2298822dd89d854444b
    • Su primer puramente ruby solución gotas zona horaria de información, la segunda no
    • He actualizado la respuesta para tomar la zona horaria en cuenta y se sustituye la segunda variación. @Tony muy buena captura, en realidad eran susceptibles a la pérdida de información de zona horaria en un vistazo más de cerca. DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
    • Zona HORARIA: Puede ser alterado por la palabra clave desplazamiento en el argumento de hash: DateTime.ahora.cambio({ hora: 0 mín: 0, s: 0 offset: ‘+02:00’})
    • Lástima que no hay un change!() método. 🙁

  2. 34

    No importa, lo consiguió. Necesidad de crear un nuevo DateTime:

    DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
    • Yep. Que es una solución de trabajo. Muchas Gracias!
    • Buena respuesta. Sólo quería añadir que los ceros representan HORA, MINUTO, SEGUNDO y OFFSET (zona horaria) en ese orden.
    • Después de no conseguir que esto funcione, he aprendido que con: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0) funciona.
    • No olvides: now = DateTime.now
    • También tenga en cuenta que el último argumento debe ser una cadena de la zona horaria por ejemplo, («-0700») para el MST, no es un entero
    • A menos que usted está tratando con fechas históricas, NO USO DateTime. Tendrás problemas molestos si usted vive en un país que tiene horario de verano, como el reino unido. Ver una explicación aquí. gist.github.com/pixeltrix/e2298822dd89d854444b

  3. 4

    Advertencia: DateTime.now.midnight y DateTime.now.beginning_of_day devuelven el mismo valor (que es la hora cero del día actual de la medianoche no retorno 24:00:00 como se puede esperar de su nombre).

    Así que voy a añadir esto como información adicional para cualquiera que pueda utilizar el aceptado respuesta a calcular la medianoche x días en el futuro.

    Por ejemplo, una prueba gratis de 14 dias que debería expirar en la medianoche del día 14:

    DateTime.now.midnight + 14.days

    es la mañana del día 14, lo que equivale a un 13.x días de prueba (x es la parte del día más – si ahora es mediodía, entonces es de 13,5 días de prueba).

    Usted realmente necesita para hacer esto:

    DateTime.now.midnight + 15.days

    para obtener la medianoche del día 14.

    Por esta razón yo siempre prefiero usar beginning_of_day, ya que es de 00:00:00. El uso de la medianoche puede ser engañoso/incomprendido.

  4. 2

    Si usted usa con frecuencia considere la posibilidad de instalar esta joya a mejorar fecha de análisis:

    https://github.com/mojombo/chronic

    require 'chronic'
    
    Chronic.parse('this 0:00')
    • No estoy seguro de por qué esta respuesta está marcado como derecho. Realmente no responder a la pregunta. Sé cómo analizar una cadena a una fecha. Pero me gustaría saber cómo cambiar una parte de una fecha determinada instancia. Por ejemplo el año. Alguna idea? En Java sólo quiero usar el setter para el año. Pero no funciona en Rubí 🙁
    • No confío en crónica de la gema más. Es muy anticuado. Yo tenía problema en el análisis de la fecha y hora en tiempo de ejecución en mi aplicación que resultó en la pérdida de negocio.

Dejar respuesta

Please enter your comment!
Please enter your name here