假设我有一个日期时间对象,例如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"))
Nevermind,得到了。需要创建一个新的DateTime:
DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
警告:DateTime.now.midnight
和DateTime.now.beginning_of_day
返回相同的值(即当天的零时-午夜不会像您从其名称中预期的那样返回24:00:00)。
因此,我将此添加为进一步的信息,以供任何可能使用已接受的答案来计算未来x天午夜的人使用。
例如,应该在第14天午夜到期的14天免费试用:
DateTime.now.midnight + 14.days
是第14天的上午,相当于一个13天的试验(x是一天中剩下的部分——如果现在是中午,那么就是13.5天的试验)。
你实际上需要这样做:
DateTime.now.midnight + 15.days
到第14天午夜。
出于这个原因,我总是更喜欢使用beginning_of_day
,因为那是00:00:00。使用午夜可能会引起误解。
如果你经常使用它,可以考虑安装这个gem来改进日期解析:
https://github.com/mojombo/chronic
require 'chronic'
Chronic.parse('this 0:00')