nom*_*men 5 haskell calendar date aeson
我正在尝试为 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)
Run Code Online (Sandbox Code Playgroud)
这让我相信一天不是物理上的一天,而是 MJD 日历中的一天(原则上公开的文档应该告诉我们类型代表什么,而不是类型的表示)。
为什么不parseTime完全按照你想要的去做? parseTime defaultTimeLocale "%F"正好是 的倒数(直到Just)showGregorian,如以下可以粘贴到 GHCi 中的代码片段所示。
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]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1567 次 |
| 最近记录: |