在ruby中设置DateTime的时间部分

时间:2011-06-13 06:52:48

标签: ruby datetime

说我有一个日期时间对象,例如DateTime.now。我想将小时和分钟设置为0(午夜)。我怎么能这样做?

4 个答案:

答案 0 :(得分:199)

在Rails环境中:

感谢ActiveSupport,您可以使用:

DateTime.now.midnight
DateTime.now.beginning_of_day

OR

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

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

在纯Ruby环境中:

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

OR

now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))

答案 1 :(得分:34)

没关系,明白了。需要创建一个新的DateTime:

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

答案 2 :(得分:3)

警告DateTime.now.midnightDateTime.now.beginning_of_day返回相同的值(即当天的零小时 - 午夜不会像往返一样返回24:00:00期待它的名字。)

所以我将这个作为进一步信息添加到任何可能使用接受的答案来计算将来午夜x天的人。

例如,14天的免费试用期将在第14天的午夜到期:

DateTime.now.midnight + 14.days

是第14天的早晨,相当于13.x天的试验(x是剩下的一天的一部分 - 如果现在是中午,那么它是13.5天的试验)。

您实际上需要这样做:

DateTime.now.midnight + 15.days

到了第14天的午夜。

出于这个原因,我总是喜欢使用beginning_of_day,因为那是00:00:00。使用午夜可能会误导/误解。

答案 3 :(得分:2)

如果您经常使用它,请考虑安装此gem以改进日期解析:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')