Haskell:
Obliczanie daty w przyszłości lub przeszłości
How to: | Jak to zrobić:
W Haskellu używamy biblioteki time do pracy z datami. Oto przykład dodawania dni do aktualnej daty:
import Data.Time
addDaysToCurrent :: Integer -> IO Day
addDaysToCurrent n = do
today <- getCurrentTime
let nDaysAfter = addDays n . utctDay $ today
return nDaysAfter
main :: IO ()
main = do
futureDate <- addDaysToCurrent 10
print futureDatePrzykładowe wyjście:
2023-04-25Aby obliczyć datę w przeszłości, odejmujemy dni:
subtractDaysFromCurrent :: Integer -> IO Day
subtractDaysFromCurrent n = do
today <- getCurrentTime
let nDaysBefore = addDays (-n) . utctDay $ today
return nDaysBefore
main :: IO ()
main = do
pastDate <- subtractDaysFromCurrent 10
print pastDatePrzykładowe wyjście:
2023-04-05Deep Dive | Wnikliwa analiza:
Obliczanie dat w Haskellu wykorzystuje bibliotekę time, która jest standardem od momentu jej wprowadzenia w GHC 6.8. Jest ona inspirowana biblioteką Joda-Time z Javy. Alternatywy jak old-time są obecnie rzadziej używane.
Kluczowe typy danych to UTCTime, Day, TimeOfDay. Istnieje też spora gama funkcji jak addDays czy diffUTCTime dla operacji na datach.
Zarządzanie czasem jest niebanalne przez strefy czasowe i zmiany czasu (Daylight Saving Time). Biblioteka time radzi sobie z tymi zagadnieniami, lecz w praktyce brane są też inne biblioteki jak timezone-series czy timezone-olson.
See Also | Zobacz również:
- Oficjalna dokumentacja biblioteki
time: http://hackage.haskell.org/package/time - Tutorial do zarządzania czasem w Haskellu: https://www.haskell.org/haskellwiki/Working_with_time
- Joda-Time, inspiracja dla
time: https://www.joda.org/joda-time/ - Alternatywa
timezone-series: http://hackage.haskell.org/package/timezone-series