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