ตั้งค่าส่วนเวลาของ DateTime ในทับทิม


106

DateTime.nowบอกว่าผมมีเช่น datetime วัตถุ ฉันต้องการตั้งค่าชั่วโมงและนาทีเป็น 0 (เที่ยงคืน) ฉันจะทำเช่นนั้นได้อย่างไร?

คำตอบ:


224

ภายในสภาพแวดล้อม 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 วิธีการเปลี่ยนเป็นส่วนหนึ่งของรางไม่ใช่ทับทิม ตัวเลือกเวลา (ชั่วโมงนาทีวินาที) จะรีเซ็ตแบบเรียงซ้อนดังนั้นหากผ่านไปเพียงชั่วโมงนาทีและวินาทีจะถูกตั้งค่าเป็น 0 หากชั่วโมงและนาทีผ่านไปวินาทีจะถูกตั้งค่าเป็น 0
แอนนา

1
โปรดทราบว่า DateTime.now.midnight ไม่ส่งคืน 24:00:00 ตามที่คุณคาดหวังมันจะส่งกลับ 00:00:00 ซึ่งเป็นค่าเดียวกับ start_of_day ดูคำตอบของฉันว่าเหตุใดสิ่งนี้จึงมีความสำคัญในบางสถานการณ์
rmcsharry

1
วิธีแก้ปัญหาทับทิมอย่างแท้จริงครั้งแรกของคุณจะลดข้อมูลเขตเวลาส่วนที่สองของคุณไม่ได้
Tony

2
ฉันได้อัปเดตคำตอบเพื่อพิจารณาเขตเวลาและแทนที่รูปแบบที่สอง @ Tony จับได้ดีมากจริงๆแล้วพวกเขาทั้งคู่อ่อนไหวต่อการสูญเสียข้อมูลเขตเวลาในการมองใกล้ ๆ DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
ashoda

TIMEZONE: สามารถเปลี่ยนแปลงได้โดยการชดเชยคำหลักในแฮชอาร์กิวเมนต์: 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
คำตอบที่ดี. แค่อยากจะเพิ่มว่าศูนย์เหล่านั้นแทนชั่วโมงนาทีวินาทีและออฟเซ็ต (เขตเวลา) ตามลำดับนั้น
d_ethier

3
หลังจากล้มเหลวในการทำให้สิ่งนี้ใช้งานได้ฉันได้เรียนรู้สิ่งนั้นด้วย: DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0)มันได้ผล
Ekkstein

3
อย่าลืม: now = DateTime.now
Abel

1
นอกจากนี้โปรดทราบว่าอาร์กิวเมนต์สุดท้ายต้องเป็นสตริงของเขตเวลาเช่น ("- 0700") สำหรับ MST ไม่ใช่จำนวนเต็ม
Donavan White

2
DateTimeถ้าคุณกำลังติดต่อกับวันที่ประวัติศาสตร์ไม่ได้ใช้ คุณจะได้รับปัญหาที่น่ารำคาญหากคุณอาศัยอยู่ในประเทศที่มีเวลาออมแสงเช่นสหราชอาณาจักร ดูคำอธิบายที่นี่ gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

คำเตือน : DateTime.now.midnightและDateTime.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

หากคุณใช้บ่อยๆให้พิจารณาติดตั้งอัญมณีนี้เพื่อปรับปรุงการแยกวิเคราะห์วันที่:

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

ฉันไม่แน่ใจว่าทำไมคำตอบนี้จึงถูกทำเครื่องหมายว่าถูกต้อง มันตอบคำถามไม่ได้จริงๆ ฉันรู้วิธีแยกวิเคราะห์สตริงเป็นวันที่ แต่ฉันต้องการทราบวิธีการเปลี่ยนบางส่วนของอินสแตนซ์วันที่ที่กำหนด ตัวอย่างเช่นปีพ. ความคิดใด ๆ ? ใน Java ฉันจะใช้ setter สำหรับปี แต่มันใช้ไม่ได้ใน Ruby :-(
Robert Reiz

1
ฉันไม่ไว้ใจอัญมณีเรื้อรังอีกต่อไป มันล้าสมัยจริงๆ ฉันมีปัญหาในการแยกวิเคราะห์วันที่ - เวลาในเวลาทำงานในแอปของฉันซึ่งส่งผลให้สูญเสียธุรกิจ
Vijay Meena
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.