在Ruby中设置DateTime的一部分

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

在Rails环境中:

感谢ActiveSupport,您可以使用:

 DateTime.now.midnight DateTime.now.beginning_of_day 

要么

 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) 

要么

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

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

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

如果你经常使用它,可以考虑安装这个gem来改进date分析:

https://github.com/mojombo/chronic

 require 'chronic' Chronic.parse('this 0:00') 

警告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 

在十四号获得午夜。

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