Tính toán ngày trong tương lai hoặc quá khứ

Haskell:
Tính toán ngày trong tương lai hoặc quá khứ

Cách thực hiện:

Haskell sử dụng các thư viện như time để xử lý với ngày tháng. Dưới đây là cách để thêm ngày hoặc tháng vào một ngày, hoặc trừ chúng để tìm một ngày trong quá khứ.

import Data.Time

-- Thêm ngày vào ngày hiện tại
addDaysToCurrent :: Integer -> IO Day
addDaysToCurrent n = do
  today <- getCurrentTime
  timezone <- getCurrentTimeZone
  let localToday = utcToLocalTime timezone today
  return $ addDays n (localDay localToday)

-- Sử dụng: addDaysToCurrent 10 để thêm 10 ngày vào ngày hiện tại

-- Tính toán một ngày trong tương lai hoặc quá khứ bằng cách thêm hoặc trừ ngày
calculateDate :: Day -> Integer -> Day
calculateDate start n = addDays n start

-- Ví dụ sử dụng:
-- let futureDate = calculateDate (fromGregorian 2023 1 1) 90

-- Để xử lý tháng và năm, chúng ta sử dụng `addGregorianMonthsClip` và `addGregorianYearsClip`
calculateDateMonths :: Day -> Integer -> Day
calculateDateMonths start n = addGregorianMonthsClip n start

-- Sử dụng:
-- let futureMonth = calculateDateMonths (fromGregorian 2023 1 1) 2

-- Xuất ngày dưới dạng YYYY-MM-DD
printFormattedDate :: Day -> IO ()
printFormattedDate date = putStrLn $ formatTime defaultTimeLocale "%F" date

-- Sử dụng:
-- printFormattedDate futureDate

Sâu hơn

Trong Haskell, chúng ta thường tới thư viện time cho các tính toán ngày tháng. Thư viện này cung cấp các kiểu và hàm cho phép tính Toán thời gian, phân tích cú pháp, và định dạng. Truyền thống, mọi người sẽ điều chỉnh ngày tháng bằng tay, nhưng các thư viện như time giải quyết những khúc mắc của lịch (như năm nhuận).

Các phương án thay thế cho time bao gồm Data.Time.Calendar.OrdinalDateData.Time.Clock.POSIX cho các nhu cầu khác nhau, như làm việc với số tuần hoặc dấu thời gian.

Về mặt triển khai, việc tính toán ngày tháng là tương đối phức tạp. Ngay cả với time, các hàm như addGregorianMonthsClip đảm bảo ngày kết quả là hợp lệ. Ví dụ, thêm một tháng vào ngày 31 tháng Giêng sẽ “clip” đến ngày cuối cùng của tháng Hai (hoặc ngày 28 hoặc 29), không phải ngày 3 tháng Ba.

Xem thêm