type now example data _id ruby

ruby - example - mongodb insert date now



Ruby: combine los objetos Date y Time en DateTime (6)

Al usar seconds_since_midnight , los cambios en el horario de verano pueden generar resultados inesperados.

Time.zone = ''America/Chicago'' t = Time.zone.parse(''07:00'').seconds_since_midnight.seconds d1 = Time.zone.parse(''2016-11-06'').to_date # Fall back d2 = Time.zone.parse(''2016-11-07'').to_date # Normal day d3 = Time.zone.parse(''2017-03-12'').to_date # Spring forward d1 + t #=> Sun, 06 Nov 2016 06:00:00 CST -06:00 d2 + t #=> Mon, 07 Nov 2016 07:00:00 CST -06:00 d3 + t #=> Sun, 12 Mar 2017 08:00:00 CDT -05:00

Aquí hay una alternativa, similar a la respuesta de @ selva-raj anterior, usando interpolación de cadenas, strftime y parse . %F es igual a %Y-%m-%d y %T es igual a %H:%M:%S

Time.zone = ''America/Chicago'' t = Time.zone.parse(''07:00'') d1 = Time.zone.parse(''2016-11-06'').to_date # Fall back d2 = Time.zone.parse(''2016-11-07'').to_date # Normal day d3 = Time.zone.parse(''2017-03-12'').to_date # Spring forward Time.zone.parse("#{d1.strftime(''%F'')} #{t.strftime(''%T'')}") #=> Sun, 06 Nov 2016 07:00:00 CST -06:00 Time.zone.parse("#{d2.strftime(''%F'')} #{t.strftime(''%T'')}") #=> Sun, 07 Nov 2016 07:00:00 CST -06:00 Time.zone.parse("#{d3.strftime(''%F'')} #{t.strftime(''%T'')}") #=> Sun, 12 Mar 2017 07:00:00 CDT -05:00

Pregunta simple, pero no puedo encontrar una respuesta buena o definitiva. ¿Cuál es la mejor y más eficiente forma de combinar los objetos Ruby Date y Time ( objetos , no cadenas) en un solo objeto DateTime?


Encontré esto, pero no es tan elegante como esperarías:

d = Date.new(2012, 8, 29) t = Time.now dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec, t.zone)

Por cierto, el objeto Ruby Time también almacena un año, un mes y un día, por lo que lo descartaría al crear DateTime.


Encontré otra manera, espero que esto sea correcto.

datetojoin=Time.parse(datetime).strftime("%Y-%m-%d") timetojoin=Time.parse(time).strftime("%T") joined_datetime = Time.parse(datetojoin +" "+ timetojoin).strftime("%F %T")

¿Alguna idea? Por favor comparte.


Lo necesito todo el tiempo y construí un método para extender la clase DateTime para combinar una fecha y una hora. Toma la zona desde la fecha para que no termine una hora con el horario de verano .

Además, por comodidad, me gusta poder pasar cadenas también.

class DateTime def self.combine(d, t) # pass in a date and time or strings d = Date.parse(d) if d.is_a? String t = Time.zone.parse(t) if t.is_a? String # + 12 hours to make sure we are in the right zone # (eg. PST and PDT switch at 2am) zone = (Time.zone.parse(d.strftime("%Y-%m-%d")) + 12.hours ).zone new(d.year, d.month, d.day, t.hour, t.min, t.sec, zone) end end

Entonces puedes hacer:

DateTime.combine(3.weeks.ago, "9am")

o

DateTime.combine("2015-3-26", Time.current)

etc ...


Sencillo:

Date.new(2015, 2, 10).to_datetime + Time.parse("16:30").seconds_since_midnight.seconds # => Object: Tue, 10 Feb 2015 16:30:00 +0000

¡Tienes que amar a Ruby!


Si usa Rails, pruebe cualquiera de estos:

d = Date.new(2014, 3, 1) t = Time.parse("16:30") dt = d + t.seconds_since_midnight.seconds # => ActiveSupport::TimeWithZone dt = (d + t.seconds_since_midnight.seconds).to_datetime # => DateTime dt = DateTime.new(d.year, d.month, d.day, t.hour, t.min, t.sec) # => DateTime