การคำนวณวันที่ในอนาคตหรืออดีต

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 มีนาคม

ดูเพิ่มเติม