在红宝石中设置DateTime的时间部分


Answers:


220

在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"))

26
FWIW,更改方法是Rails而不是ruby的一部分。的时间选项(小时,分钟,秒)复位cascadingly,因此,如果仅小时通过,则分和秒被设置为0。如果的小时和分钟被传递,然后秒被设置为0
安娜

1
请注意,DateTime.now.midnight不会像您期望的那样返回24:00:00,而是返回00:00:00-与Beginning_of_day相同的值。看到我的回答,为什么这在某些情况下可能很重要。
rmcsharry16年

1
你的第一个纯粹的红宝石解决方案下降时区信息,你的第二个没有
托尼

1
我已经更新了答案,以考虑到时区,并替换了第二个变体。@Tony非常出色,实际上他们俩都容易受到时区信息丢失的影响。 DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
ashoda '16

时区:可以通过参数哈希中的关键字offset进行更改:DateTime.now.change({hour:0,min:0,sec:0 offset:'+02:00'})
Ekkstein

34

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

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

6
好答案。只是想补充一下,这些零分别代表HOUR,MINUTE,SECOND和OFFSET(时区)。
d_ethier

3
在无法使其正常工作之后,我了解到: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0)它可以工作。
Ekkstein

2
不要忘记: now = DateTime.now
Abel

1
还需要注意的是,最后一个参数必须是时区的字符串,例如MST(例如“” -0700“),而不是整数
Donavan White

2
除非您要处理历史日期,否则请勿使用DateTime。如果您居住在像英国这样的具有夏令时的国家,则会遇到麻烦的问题。在这里查看说明。gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

警告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。使用午夜可能会误导/误解。


1

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

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

我不确定为什么将这个答案标记为正确。它并不能真正回答问题。我知道如何将字符串解析为日期。但是我想知道如何更改给定日期实例的特定部分。例如年份。有任何想法吗?在Java中,我只使用setter一年。但这在Ruby中不起作用:-(
罗伯特·雷兹

1
我不再相信慢性宝石了。真的过时了。我在应用程序中在运行时解析日期时间时遇到问题,导致业务损失。
Vijay Meena
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.