Days between dates: Difference between revisions

m
→‎{{header|Haskell}}: Added a variation (monadic composition in lieu of error handling)
m (→‎{{header|Haskell}}: Added a variation (monadic composition in lieu of error handling))
Line 952:
stringToDay date = parseTimeM True defaultTimeLocale "%Y-%-m-%-d" date</lang>
{{out}}
<pre>There are 274272 days between 20152019-1201-3101 and 20162019-09-30.
<pre>
There are 272274 days between 20192015-0112-0131 and 20192016-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}}==
9,655

edits