【问题标题】:How to add minutes to current time using Data.Time.UTCTime?如何使用 Datetime.UTC 时间将分钟添加到当前时间?
【发布时间】:2016-10-02 09:46:12
【问题描述】:

我想在给定的时间加上/减去给定的分钟数并找出结果时间。

例如假设给定时间是上午 11:30,要添加的分钟数是 100,那么结果时间是下午 1:10

如何在 Haskell 中使用 Data-Time 库做到这一点?我尝试阅读the docs on the Haskell site,但几乎什么也读不出来。

该文档站点上没有显示示例。此外,cookbook on the Haskell site 不包含任何时间计算示例。

编辑:不需要当前时间,它应该适用于任何给定时间。时间可以以字符串形式给出,例如“11:30”。

【问题讨论】:

  • 时间是您需要vector-space 的主要示例,它区分点(时间戳)和向量(时间间隔)。我怀疑这个库缺少这个基本功能。看来您可以使用 dayFractionToTimeOfDay 及其反例,但您不能那样穿越午夜。
  • 正如 Sibi 所指出的,UTCTime(时间戳)和NominalDiffTime(持续时间)之间存在区别。也许他们确实可以使用向量空间实例。

标签: haskell time clock


【解决方案1】:

您可以使用Data.Time.Clock.getCurrentTime 获取当前时间。这将返回 IO UTCTime

然后您可以使用Data.Time.Clock.addUTCTime 将分钟添加到之前获取的时间。

import Data.Time

currentTimePlusMinutes minutes = getCurrentTime 
  >>= (\time -> return (addUTCTime (minutes * 60) time))

如果你不想使用当前时间,你可以简单地做

 addMinutes :: NominalDiffTime -> UTCTime -> UTCTime
 addMinutes minutes = addUTCTime (minutes * 60)

 λ> addMinutes 10 time
 2016-10-02 12:41:09.68297 UTC

【讨论】:

  • 我仍然是 haskell 的初学者,我不确定 >>= (\t -> ...) 表示法是否是编写此代码的最佳方式。有人有推荐吗?
  • addMinutes 10 time 几点钟了?
  • 问题中提到的“给定时间”。
  • 您可以在 ghci 中使用 :t addMinutes 自己解决这个问题。在这种情况下,它输出addMinutes :: NominalDiffTime -> UTCTime -> UTCTime,所以时间需要是UTCTime
  • 这是一个复杂的话题。如果您想得到答案,您可能应该发布另一个问题。
【解决方案2】:

添加 100 分钟的示例演示:

λ> import Data.Time
λ> currentTime <- getCurrentTime
λ> currentTime
2016-10-02 10:27:03.30961 UTC
λ> currentZone <- getCurrentTimeZone
λ> currentZone
IST
λ> utcToLocalTime currentZone currentTime
2016-10-02 15:57:03.30961
λ> let hundredMinutes = 100 * 60
λ> addUTCTime hundredMinutes currentTime
2016-10-02 12:07:03.30961 UTC
λ> let newTime = addUTCTime hundredMinutes currentTime
λ> utcToLocalTime currentZone newTime
2016-10-02 17:37:03.30961

addUTCTime 函数用于增加 100 分钟。 也可以使用等效函数for subtracting

【讨论】:

  • 请注意 diffUtcTimeaddUTCTime 的签名不同。
  • @mb14 哦,是的,你是对的。那么,对于减法,只需将hundredMinutes 设为- 100 * 60。 :)
  • 我不想使用 IO monad,我在程序本身有一个时间值。此外,我不仅需要当前时间。编辑以反映这一点。很抱歉之前没有说清楚。
  • @mntk123 你不需要使用 IO monad。但是您需要一个函数来将您的时间转换为LocalTimeUTCTime
  • @Sibi 再次感谢。在 Haskell 网站上找到的文档最令人沮丧的是,在大多数情况下,它们甚至没有显示一个示例 :( 这很糟糕。将其与 Python 进行比较。无论如何,我会尝试。我会为此提出一个单独的问题。
猜你喜欢
  • 2015-06-10
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2019-12-20
  • 2012-08-14
  • 2020-07-02
  • 1970-01-01
相关资源
最近更新 更多