Days between dates: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: Added a variation (monadic composition in lieu of error handling))
Line 952: Line 952:
stringToDay date = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date</lang>
stringToDay date = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date</lang>
{{out}}
{{out}}
<pre>There are 272 days between 2019-01-01 and 2019-09-30.
<pre>
There are 272 days between 2019-01-01 and 2019-09-30.
There are 274 days between 2015-12-31 and 2016-09-30.</pre>

There are 274 days between 2015-12-31 and 2016-09-30.
Or, composing rather than raising errors:
</pre>

<lang haskell>module Tokenized where

import Data.Time (Day)
import Data.Time.Calendar (diffDays)
import Data.Time.Format (defaultTimeLocale, parseTimeM)

-------------------- DAYS BETWEEN DATES ------------------

daysBetween :: String -> String -> Maybe Integer
daysBetween s1 s2 =
dayFromString s1
>>= ( \d1 ->
dayFromString s2
>>= \d2 -> Just $ diffDays d2 d1
)

dayFromString :: String -> Maybe Day
dayFromString =
parseTimeM
True
defaultTimeLocale
"%Y-%-m-%-d"

--------------------------- TEST -------------------------
main :: IO ()
main =
mapM_
(putStrLn . uncurry showDateDiff)
[ ("2019-01-01", "2019-09-30"),
("2015-12-31", "2016-09-30")
]

showDateDiff :: String -> String -> String
showDateDiff xs ys =
maybe
( unlines
["Unparseable as date string pair:", xs, ys]
)
( \n ->
concat
["There are ", show n, " days between ", xs, " and ", ys, "."]
)
$ daysBetween xs ys</lang>
{{Out}}
<pre>There are 272 days between 2019-01-01 and 2019-09-30.
There are 274 days between 2015-12-31 and 2016-09-30.</pre>


=={{header|J}}==
=={{header|J}}==