【问题标题】:Haskell: convert Day to UNIX timestampHaskell:将 Day 转换为 UNIX 时间戳
【发布时间】:2024-01-23 14:03:01
【问题描述】:

如何获得“一周前”的 UNIX 时间戳?目前我这样做:

import Data.Time
...
oneWeekAgo = toTimestamp . addDays (-7) <$> now
  where now = utctDay <$> getCurrentTime
        toTimestamp = formatTime defaultTimeLocale "%s"

但这不起作用,因为 formatTime 返回一个 empty 字符串。

【问题讨论】:

    标签: haskell time timestamp


    【解决方案1】:

    我不确定您到底想要什么,但您可能需要修改 utctDay 并使用 utcTimeToPOSIXSecondsUTCTime 转换为 posix 时间戳。

    import Data.Time
    import Data.Time.Clock.POSIX
    
    oneWeekAgo = do now <- getCurrentTime
                    let oneWeekAgo = now { utctDay = addDays (-7) $ utctDay now }
                    return $ utcTimeToPOSIXSeconds oneWeekAgo
    

    或者只是减去秒数也可以。

    oneWeekAgo = ((subtract (7 * 24 * 60 * 60)) . utcTimeToPOSIXSeconds) <$> getCurrentTime
    

    【讨论】:

    • 后者又短又甜,但是7 * 24 * 60 * 60 可以吗?我喜欢写-7,因为很明显我们正在尝试做什么。
    【解决方案2】:

    我刚刚想出的解决方案是使用UTCTime day 0 将日期值转换回时间。

    import Data.Time
    ...
    oneWeekAgo = toTimestamp . toTime . addDays (-7) <$> now
      where now = utctDay <$> getCurrentTime
            toTimestamp = formatTime defaultTimeLocale "%s"
            toTime day = UTCTime day 0
    

    【讨论】: