【问题标题】:Haskell Date parsingHaskell 日期解析
【发布时间】:2014-05-03 00:35:43
【问题描述】:

我正在尝试为 Data.Time.Calendar's Day 类型创建一个 FromJSON 实例。我对这些类型感到困惑,这似乎是一个应该解决的常见情况。

所以 Day 类型表示修改后的儒略日期。而Data.Time.Calendar模块定义了“showGregorian”,它将修改后的儒略日期转换为公历日期,并输出一个String ISO 8601表示。

问题在于 Data.Time.Calendar 没有将 ISO 8601 解析为公历日期的好方法。如果我使用 ParseTime 类,我只能传递字符串格式,而不是字符串代表日期的日历。因此,实际上,我将传入“20140502”,ParseTime 类将该字符串视为修改后的 Julian 日期的字符串表示形式。

看来这应该是一个已解决的问题。理想情况下,我想要一个不使用日期时间的解决方案。我的模型使用公历日期,因为这就是我所需要的,而这些就是我将要比较、搜索等的东西。

当然,当我只需要日历日时使用日历日的全部原因是这样我就不必考虑如何比较和转换它们,但我想那是另一天的抱怨。

附录:

天定义为:

-- | 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 日历中的一天(根据公开的文档应该告诉我们类型代表什么,而不是类型的表示的原则)。

【问题讨论】:

  • 我不确定我是否完全了解您的需求。最近我正在处理日期解析的痛苦,我发现这个库工作得非常好。 github.com/singpolyma/git-date-haskell 希望对您有所帮助
  • 我追求的是一种将 ISO 8601 日期解析为“日”的无错误方法,该方法使用修改后的儒略历。看起来 Yesod 犯了我试图避免的错误(我正在查看它的代码作为示例)

标签: date haskell calendar aeson


【解决方案1】:

为什么parseTime 不完全按照您的意愿行事? parseTime defaultTimeLocale "%F" 正好是 showGregorian 的倒数(直到 Just),如下面的 sn-p 所示,您可以将其粘贴到 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]

【讨论】:

  • 正如您所演示的,它确实可以满足我的要求。但文件不清楚。特别是,'%F' 只是一种“格式”——一种解析和呈现日期的方法。这不是日历。库必须假设 %F 格式的日期是公历。这是一个未记录的假设,违反了 Day 类型的既定意图。它仍然意味着图书馆被破坏了,因为这意味着我无法将时间解析到修改后的儒略日期日历中。谢谢你的帮助,我想我要把这个带到咖啡馆。
  • time 文档可能很难理解,当然。但是,我不明白您为什么认为存在错误。你能展示一些错误的行为吗?一天不是“格里高利”或“儒略”。这只是一天。然而,它可以有公历或儒略的表示
  • 请参阅问题的附录。基本上,文档说 Day 是 MJD,而不是物理日。
  • 不,它没有这么说。它描述了 MJD 是什么,因为恰好Day 被存储为 MJD。这并不意味着 Day is 是 MJD。这只是它的代表。再次,请展示一些错误的行为。
  • 文档的目的是告诉我一个类型代表什么,而不是它的代表是什么。我不明白你为什么要我演示错误行为,而你已经演示过了。文档不同意实施。我不明白我们为什么要争论它。首先,我说我要把这个带到别处。其次,文档非常清晰。这是错误的。
【解决方案2】:

GHC.Generics 模块让这类问题很容易解决。

{-# language DeriveGeneric #-}
{-# language StandaloneDeriving #-}

import Data.Aeson
import Data.Time.Calendar

import GHC.Generics

deriving instance Generic Day

instance ToJSON  Day
instance FromJSON  Day

尽管阅读了您的评论:

我追求的是一种将 ISO 8601 日期解析为“日”的无错误方法,该方法使用修改后的儒略历。

这可能不是您正在寻找的解决方案。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多