Ruby:
การคำนวณวันที่ในอนาคตหรืออดีต
วิธีการ:
Ruby ทำให้การเล่นกับวันที่ง่ายดายโดยใช้คลาส Date ในตัวและ gem active_support เพื่อเพิ่มความสะดวกในการใช้งาน เรามาดูวิธีทำกัน:
require 'date'
require 'active_support/core_ext/integer'
# รับวันที่ของวันนี้
today = Date.today
puts "วันนี้คือ: #{today}"
# คำนวณวันที่ในอนาคต 10 วัน
future_date = today + 10
puts "10 วันข้างหน้าจะเป็น: #{future_date}"
# คำนวณวันที่ในอดีต 30 วัน
past_date = today - 30
puts "30 วันที่แล้วเป็น: #{past_date}"
# การคำนวณที่ซับซ้อนมากขึ้นกับ active_support
puts "ใน 2 เดือนข้างหน้าจะเป็น: #{2.months.from_now.to_date}"
puts "100 วันที่แล้วมันเป็น: #{100.days.ago.to_date}"ผลลัพธ์ที่ตัวอย่าง:
วันนี้คือ: 2023-04-07
10 วันข้างหน้าจะเป็น: 2023-04-17
30 วันที่แล้วเป็น: 2023-03-08
ใน 2 เดือนข้างหน้าจะเป็น: 2023-06-07
100 วันที่แล้วมันเป็น: 2022-12-28รายละเอียดเพิ่มเติม
ก่อนที่ Ruby จะรวมฟังก์ชันการคำนวณวันที่เข้ากับไลบรารีมาตรฐานและเพิ่มเติม, นักพัฒนามักต้องคำนวณวันที่ด้วยตัวเอง โดยพิจารณาถึงปีอธิกสุรทิน, ความยาวของเดือนที่ต่างกัน, และโซนเวลา—ใช่, เป็นเรื่องที่ปวดหัว
คลาส Date มาตรฐานทำสิ่งต่าง ๆ ได้มากโดยตรง คุณสามารถเพิ่ม (+) หรือหัก (-) วันได้อย่างง่ายดาย อย่างไรก็ตาม, สำหรับการจัดการช่วงเวลาที่มีความหมายมากขึ้นเช่น “2 เดือนจากนี้”, เราต้องพึ่งพา active_support, ซึ่งแยกออกมาจาก Ruby on Rails บรรจุภัณฑ์นี้ใช้การขยายคลาส Ruby มาตรฐาน, ทำให้การคำนวณเหล่านี้เป็นมิตรกับผู้ใช้
เมื่อคำนวณวันที่ในอดีตหรืออนาคต, ถ้าคุณยังคำนวณเวลาด้วย (DateTime หรือ Time อ็อบเจกต์) คุณควรพิจารณาถึงโซนเวลาด้วย คลาส Time ของ Ruby และ active_support สามารถจัดการกับสิ่งนี้ได้ แต่ต้องการการตั้งค่าเพิ่มเติม
มีตัวเลือกอื่น ๆ เช่น บรรจุภัณฑ์ time-lord และ ice_cube, ที่นำเสนอการหวานปากหรือคุณสมบัติเฉพาะ (เช่น เหตุการณ์ที่เกิดซ้ำ), ตามลำดับ
ดูเพิ่มเติมที่
- การจัดการกับโซนเวลาใน Ruby: https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
- บรรจุภัณฑ์ ’time-lord’ สำหรับการแสดงออกที่ใกล้เคียงกับมนุษย์มากขึ้น: https://github.com/krainboltgreene/time-lord
- บรรจุภัณฑ์ ‘ice_cube’ สำหรับการจัดการกับเหตุการณ์ที่เกิดขึ้นซ้ำ: https://github.com/seejohnrun/ice_cube