Tulevan tai menneen päivämäärän laskeminen

Haskell:
Tulevan tai menneen päivämäärän laskeminen

How to:

import Data.Time

-- Lisää päiviä nykyiseen päivämäärään
addDaysToCurrentDate :: Integer -> IO Day
addDaysToCurrentDate days = do
  today <- utctDay <$> getCurrentTime
  return $ addDays days today

-- Esimerkki: Lisää 10 päivää tästä päivästä
main :: IO ()
main = do
  futureDate <- addDaysToCurrentDate 10
  print futureDate

-- Tulostaisi esimerkiksi: 2023-04-15 jos tämä päivä on 2023-04-05
-- Vähennä päiviä nykyisestä päivämäärästä
subtractDaysFromCurrentDate :: Integer -> IO Day
subtractDaysFromCurrentDate days = do
  today <- utctDay <$> getCurrentTime
  return $ addDays (negate days) today

-- Esimerkki: Vähennä 10 päivää tästä päivästä
main :: IO ()
main = do
  pastDate <- subtractDaysFromCurrentDate 10
  print pastDate

-- Tulostaisi esimerkiksi: 2023-03-26 jos tämä päivä on 2023-04-05

Deep Dive

Haskellissa päivämäärien käsittelyyn voitiin kukin käyttää vanhempia kirjastoja kuten Time pakettia, mutta nykyään Data.Time kirjasto on suosiossa, kiitos sen monipuolisemman ja käyttäjäystävällisen API:n. Data.Time tarjoaa funktioita kuten addDays, joka helpottaa päivämäärien laskentaa.

Vaihtoehtoisesti voi hyödyntää myös muita kirjastopaketteja, kuten time-lens, joka tarjoaa funktionaalisempia tapoja ajan manipuloimiseen. Kuitenkin Data.Time on usein riittävä useimpiin tarpeisiin ja se on hyvin dokumentoitu.

Kun lasketaan tulevaisuuden tai menneisyyden päivämääriä, tärkeää on huomioida aikavyöhykkeet ja kesäaikaan siirtymiset. Tämä voi vaikuttaa lopputulokseen, etenkin jos ajanhetkiin liittyy kellonaikoja.

See Also