Ruby'de DateTime'ın saat bölümünü ayarlayın


104

Örneğin bir tarih saat nesnem olduğunu varsayalım DateTime.now. Saatleri ve dakikaları 0'a (gece yarısı) ayarlamak istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


220

Bir Rails ortamında:

ActiveSupport sayesinde şunları kullanabilirsiniz:

DateTime.now.midnight
DateTime.now.beginning_of_day

VEYA

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

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

Tamamen Ruby ortamında:

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

VEYA

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

26
FWIW, değişim yöntemi ruby ​​değil rayların bir parçasıdır. Zaman seçenekleri (saat, dakika, saniye) kademeli olarak sıfırlanır, böylece yalnızca saat geçilirse, dakika ve saniye 0 olarak ayarlanır. Saat ve dakika geçerse, saniye 0 olarak ayarlanır.
Anna

1
DateTime.now.midnight'ın beklediğiniz gibi 24:00:00 döndürmediğini unutmayın, 00:00:00 döndürür - begin_of_day ile aynı değerdir. Bazı senaryolarda bunun neden önemli olabileceğine dair cevabımı görün.
rmcsharry

1
İlk tamamen yakut çözümünüz saat dilimi bilgilerini
Tony

2
Saat dilimini hesaba katmak için yanıtı güncelledim ve ikinci varyasyonu değiştirdim. @Tony çok iyi yakaladı, aslında her ikisi de daha yakından bakıldığında zaman dilimi bilgisinin kaybına duyarlıydı. DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
ashoda

TIMEZONE: Bağımsız değişken karmasındaki anahtar kelime uzaklığı ile değiştirilebilir: DateTime.now.change ({hour: 0, min: 0, sec: 0 offset: '+02: 00'})
Ekkstein

34

Nevermind, anladım. Yeni bir DateTime oluşturmanız gerekiyor:

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

6
İyi cevap. Bu sıfırların bu sırayla HOUR, MINUTE, SECOND ve OFFSET'i (saat dilimini) temsil ettiğini eklemek istedim.
d_ethier

3
Bunu çalıştırmayı başaramadıktan sonra şunu öğrendim: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0)işe yarıyor.
Ekkstein

2
Unutma: now = DateTime.now
Abel

1
Ayrıca, son bağımsız değişkenin saat diliminin bir dizesi olması gerektiğini de unutmayın, örneğin MST için ("- 0700"), bir tam sayı değil
Donavan White

2
Tarihi tarihlerle uğraşmadığınız sürece KULLANMAYIN DateTime. İngiltere gibi gün ışığından yararlanma saatine sahip bir ülkede yaşıyorsanız can sıkıcı sorunlar yaşarsınız. Burada bir açıklamaya bakın. gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

Uyarı : DateTime.now.midnightve DateTime.now.beginning_of_dayaynı değeri döndür (mevcut günün sıfır saati - gece yarısı, adından beklediğiniz gibi 24:00:00 döndürmez).

Bu nedenle, bunu gelecekte x gün gece yarısı hesaplamak için kabul edilen yanıtı kullanabilecek herkes için daha fazla bilgi olarak ekliyorum.

Örneğin, 14. gün gece yarısı sona ermesi gereken 14 günlük ücretsiz bir deneme:

DateTime.now.midnight + 14.days

14. günün sabahıdır ve 13.x günlük denemeye eşittir (x, kalan günün bölümüdür - şimdi öğlense, 13.5 günlük deneme).

Aslında bunu yapmanız gerekir:

DateTime.now.midnight + 15.days

14. gün gece yarısına kadar.

Bu nedenle beginning_of_day00:00:00 olduğu için hep kullanmayı tercih ediyorum . Gece yarısını kullanmak yanıltıcı / yanlış anlaşılabilir.


1

Sık sık kullanıyorsanız, tarih ayrıştırmasını iyileştirmek için bu mücevheri yüklemeyi düşünün:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

Bu cevabın neden doğru olarak işaretlendiğinden emin değilim. Soruyu gerçekten cevaplamıyor. Bir dizeyi bir tarihe nasıl ayrıştıracağımı biliyorum. Ancak belirli bir tarih örneğinin belirli bir bölümünü nasıl değiştireceğimi bilmek istiyorum. Örneğin yıl. Herhangi bir fikir? Java'da ayarlayıcıyı yıl boyunca kullanırdım. Ama Ruby'de çalışmıyor :-(
Robert Reiz

1
Artık kronik cevherlere güvenmiyorum. Gerçekten modası geçmiş. Uygulamamda çalışma zamanında tarih-saati ayrıştırmada sorun yaşadım ve bu da iş kaybına neden oldu.
Vijay Meena
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.