5

Data.Time.Calendar の Day タイプの FromJSON インスタンスを作成しようとしています。タイプについて混乱しています。これは、解決する必要がある十分に一般的な状況のようです。

したがって、Day 型は修正されたユリウス日を表します。また、Data.Time.Calendar モジュールは「showGregorian」を定義します。これは、修正されたユリウス日付をグレゴリオ日付に変換し、文字列 ISO 8601 表現を出力します。

問題は、Data.Time.Calendar には ISO 8601 を解析してグレゴリオ暦の日付にする良い方法がないことです。ParseTime クラスを使用すると、文字列形式でのみ渡すことができ、文字列が日付を表すカレンダーは渡せません。したがって、事実上、'20140502' を渡すと、ParseTime クラスはその文字列を、修正されたユリウス日付の文字列表現として扱います。

これは解決された問題であるべきだと思われます。理想的には、日時を使用しないソリューションが必要です。私のモデルはグレゴリオ暦の日付を使用しています。それが必要なすべてであり、比較、検索などを行うものだからです。

もちろん、暦日だけが必要なときに暦日を使用した理由は、それらを比較して変換する方法を考える必要がないようにするためでしたが、それは別の日の泣き言だと思います.

補遺:

日は次のように定義されます。

-- | The Modified Julian Day is a standard count of days, with zero being the day 1858-11-17.
newtype Day = ModifiedJulianDay {toModifiedJulianDay :: Integer} deriving (Eq,Ord)

これにより、日は物理的な日ではなく、MJD カレンダーの日であると考えるようになりました (公開されたドキュメントは、型の表現ではなく、型が何を表しているかを示すべきであるという原則に基づいています)。

4

2 に答える 2

2

なぜparseTimeあなたが望むことを正確にしないのですか? GHCi に貼り付けることができる次のスニペットで示されるように、parseTime defaultTimeLocale "%F"は の逆 ( までJust) です。showGregorian

import System.Locale 
import Data.Time.Format 
import Data.Time.Calendar

let test = parseTime defaultTimeLocale "%F" . showGregorian :: Day -> Maybe Day
let notIdentity x = case test x of { Nothing -> True; Just x' -> x /= x' }
filter notIdentity [fromGregorian 0 1 1..fromGregorian 3000 12 31]
于 2014-05-03T08:39:54.990 に答える