49

簡単な質問ですが、良い答えや決定的な答えが見つかりません。Ruby の Date および Timeオブジェクト(文字列ではなく object ) を単一の DateTime オブジェクトに結合するための最良かつ最も効率的な方法は何ですか?

4

6 に答える 6

56

私はこれを見つけました、しかしそれはあなたが望むほどエレガントではありません:

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)

ちなみに、ruby Timeオブジェクトには年、月、日も格納されるため、DateTimeを作成するときにそれを破棄することになります。

于 2012-08-29T15:55:26.307 に答える
32

を使用している場合seconds_since_midnight、夏時間の変更により、予期しない結果が生じる可能性があります。

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

strftime上記の@selva-rajの回答に似た、文字列補間、、、およびを使用した代替手段を次に示しますparse%Fに等しく、 に%Y-%m-%d等しい%Tです%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
于 2016-11-06T15:22:17.270 に答える
23

単純:

Date.new(2015, 2, 10).to_datetime + Time.parse("16:30").seconds_since_midnight.seconds

# => Object: Tue, 10 Feb 2015 16:30:00 +0000

あなたはRubyを愛さなければなりません!

于 2015-02-10T12:20:34.627 に答える
13

Rails を使用している場合は、次のいずれかを試してください。

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
于 2014-03-09T23:06:40.030 に答える
1

別の方法を見つけました。これが正しいことを願っています。

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

何かご意見は?共有してください。

于 2013-02-27T17:32:44.477 に答える