在ruby中设置DateTime的时间部分

Jes*_*dge 94 ruby datetime

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

ash*_*oda 206

在Rails环境中:

感谢ActiveSupport,您可以使用:

DateTime.now.midnight
DateTime.now.beginning_of_day
Run Code Online (Sandbox Code Playgroud)

要么

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

# More concisely
DateTime.now.change({ hour: 0 })                
Run Code Online (Sandbox Code Playgroud)

在纯Ruby环境中:

now = DateTime.now
DateTime.new(now.year, now.month, now.day, 0, 0, 0, now.zone)
Run Code Online (Sandbox Code Playgroud)

要么

now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))
Run Code Online (Sandbox Code Playgroud)

  • FWIW,更改方法是rails而不是ruby的一部分.时间选项(小时,分钟,秒)级联重置,因此如果仅传递小时,则分钟和秒设置为0.如果小时和分钟通过,则秒设置为0. (25认同)
  • 我已经更新了答案以考虑时区并替换了第二个变体。@Tony 很好的捕获,他们实际上都容易在仔细观察时丢失时区信息。`DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime` (2认同)

Jes*_*dge 34

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

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

  • 好答案.只是想补充说那些零按顺序代表HOUR,MINUTE,SECOND和OFFSET(时区). (5认同)
  • 在没有让它工作之后,我学会了:`DateTime.new(Time.now.year,Time.now.month,Time.now.day,0,0,0)`它的工作原理. (3认同)
  • 别忘了:```now = DateTime.now``` (2认同)
  • 除非您处理历史日期,否则请勿使用"DateTime".如果你住在像英国一样有夏令时的国家,你会遇到烦人的问题.请在此处查看说明.https://gist.github.com/pixeltrix/e2298822dd89d854444b (2认同)

rmc*_*rry 5

警告DateTime.now.midnightDateTime.now.beginning_of_day返回相同的值(这是当天的零时 - 午夜不会像您从其名称中期望的那样返回 24:00:00)。

因此,我将此添加为任何可能使用已接受答案来计算未来午夜 x 天的人的进一步信息。

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

DateTime.now.midnight + 14.days
Run Code Online (Sandbox Code Playgroud)

是第 14 天的早晨,相当于 13.x 天的试用期(x 是当天剩余的部分 - 如果现在是中午,则是 13.5 天的试用期)。

你实际上需要这样做:

DateTime.now.midnight + 15.days
Run Code Online (Sandbox Code Playgroud)

到第 14 天的午夜。

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