今日の日付をISO8601形式で表示する
today :: (Day -> String) -> IO Stringという日付表示文字列生成関数から日付表示文字列生成アクションを構成する関数を作ります.
1. アクションgetZonedTime :: IO ZonedTimeの現在のタイムゾーン付き時刻を取得.(レシピ:現在の日時を取得する 参照). 2. zonedTimeToLocalTime :: ZonedTime -> LocalTimeでタイムゾーン付き時刻からローカル時刻を抽出.
3. localDay :: LocalTime -> Dayでローカル時刻からローカル日付を抽出.
4. 与えられたshowDate :: Day -> Stringでローカル日付から表示用文字列へ変換.
5. return で表示用文字列を返す出力アクションに変換
code: (haskell)
import Data.Time (Day, localDay, zonedTimeToLocalTime, getZonedTime, showGregorian)
import Data.Time.Calendar.OrdinalDate (showOrdinalDate)
import Data.Time.Calendar.WeekDate (showWeekDate)
today :: (Day -> String) -> IO String
today showDate = return -- 5.
. showDate -- 4.
. localDay -- 3.
. zonedTimeToLocalTime -- 2.
=<< getZonedTime -- 1.
利用例1:暦日付(calendar date)
code:_
dt <- today showGregorian
putStrLn dt -- > 2017-04-06
利用例2:暦通算日付(ordinal date)
code:_
dt <- today showOrdinalDate
putStrLn dt -- > 2017-096
利用例3:暦週日付(week date)
code:_
dt <- today showWeekDate
putStrLn dt -- > 2017-W14-4
利用例4: スタンドアロンコマンドを作る
code: (haskell)
-- today.hs
module Main where
import Data.Time (Day, localDay, zonedTimeToLocalTime, getZonedTime, showGregorian)
import Data.Time.Calendar.OrdinalDate (showOrdinalDate)
import Data.Time.Calendar.WeekDate (showWeekDate)
import System.Environment (getProgName)
main :: IO ()
main = putStrLn =<< dispatch =<< getProgName
dispatch :: String -> IO String
dispatch "todayo" = today showOrdinalDate
dispatch "todayw" = today showWeekDate
dispatch _ = today showGregorian
today :: (Day -> String) -> IO String
today showDate = return
. showDate
. localDay
. zonedTimeToLocalTime
=<< getZonedTime
暦日付,暦通算日付,暦週日付のどの形式にするかは,
プログラム名でディスパッチすることにしました.