Haskell:
การคำนวณวันที่ในอนาคตหรืออดีต
วิธีการ:
Haskell ใช้ไลบรารีเช่น time
ในการจัดการกับวันที่ นี่คือวิธีการเพิ่มหรือลบวันหรือเดือนสำหรับวันที่ในอนาคตหรืออดีต
import Data.Time
-- เพิ่มวันให้กับวันที่ปัจจุบัน
addDaysToCurrent :: Integer -> IO Day
addDaysToCurrent n = do
today <- getCurrentTime
timezone <- getCurrentTimeZone
let localToday = utcToLocalTime timezone today
return $ addDays n (localDay localToday)
-- การใช้งาน: addDaysToCurrent 10 เพื่อเพิ่ม 10 วันให้กับวันที่ปัจจุบัน
-- คำนวณวันที่ในอนาคตหรืออดีตโดยการเพิ่มหรือลบวัน
calculateDate :: Day -> Integer -> Day
calculateDate start n = addDays n start
-- ตัวอย่างการใช้งาน:
-- let futureDate = calculateDate (fromGregorian 2023 1 1) 90
-- การจัดการกับเดือนและปี เราใช้ `addGregorianMonthsClip` และ `addGregorianYearsClip`
calculateDateMonths :: Day -> Integer -> Day
calculateDateMonths start n = addGregorianMonthsClip n start
-- การใช้งาน:
-- let futureMonth = calculateDateMonths (fromGregorian 2023 1 1) 2
-- การแสดงผลวันที่ในรูปแบบ YYYY-MM-DD
printFormattedDate :: Day -> IO ()
printFormattedDate date = putStrLn $ formatTime defaultTimeLocale "%F" date
-- การใช้งาน:
-- printFormattedDate futureDate
ลงลึก
ใน Haskell, เรามักจะใช้ไลบรารี time
สำหรับการคำนวณวันที่ ไลบรารีนี้มีชนิดและฟังก์ชันสำหรับการคำนวณเชิงคณิตศาสตร์ของ DateTime, การแปลง, และการจัดรูปแบบ เดิมที ผู้คนจะปรับวันที่ด้วยตนเอง แต่ไลบรารีเช่น time
จัดการกับความแปลกประหลาดของปฏิทิน (เช่น ปีอธิกสุรทิน)
ทางเลือกของ time
รวมถึง Data.Time.Calendar.OrdinalDate
และ Data.Time.Clock.POSIX
สำหรับความต้องการที่แตกต่างกัน เช่น การทำงานกับหมายเลขสัปดาห์หรือเวลา
ในแง่ของการนำไปใช้งาน, การคำนวณวันที่นั้นมีความซับซ้อนอย่างน่าประหลาดใจ แม้แต่กับ time
, ฟังก์ชันเช่น addGregorianMonthsClip
ก็จะตรวจสอบให้แน่ใจว่าวันที่ที่ได้นั้นถูกต้อง เช่น การเพิ่มเดือนหนึ่งเดือนให้กับวันที่ 31 มกราคม จะ “คลิป” ไปยังวันสุดท้ายของเดือนกุมภาพันธ์ (ไม่ว่าจะเป็นวันที่ 28 หรือ 29) ไม่ใช่วันที่ 3 มีนาคม
ดูเพิ่มเติม
- ไลบรารี
time
ของ Haskell: http://hackage.haskell.org/package/time - คู่มือวันที่และเวลาจาก The Haskell School: https://school.haskellforall.com/#date-and-time
- การอธิบายเกี่ยวกับ ZonedTime และ UTC: https://www.47deg.com/blog/dealing-with-time-in-haskell/