簡體   English   中英

Haskell中兩個`LocalTime`(或`UTCTime`)之間的隨機時間

[英]Random time between two `LocalTime` (or `UTCTime`) in Haskell

我需要在兩個給定的LocalTime值之間生成一個隨機時間(但是如果需要的話,可以是UTCTime ,因為我可以轉換)。

我實現了生成(0, n)范圍內的數字,如下所示:

randomSeconds :: RandomGen g => g -> NominalDiffTime -> NominalDiffTime
randomSeconds rg max = realToFrac $ fst (randomR (0, max) rg)

就像這樣使用:

randomTimeBetween :: RandomGen g => TimeZone -> LocalTime -> LocalTime -> g -> UTCTime
randomTimeBetween tz s e rg = addUTCTime (randomSeconds rg (diff tz s e)) (localTimeToUTC tz s)

diff在哪里

diff :: TimeZone -> LocalTime -> LocalTime -> NominalDiffTime
diff tz st en = diffUTCTime (localTimeToUTC tz st) (localTimeToUTC tz en)

但是我處於無休止的編譯錯誤循環中,因為沒有針對(Fractional Int)實例,因此它無法推斷Random NominalDiffTime或無法從NominalDiffTime轉換。

什么是生成隨機NominalDiffTime的最合適/最簡單/什么方式,然后我可以使用addUTCTime x utc將該金額addUTCTime x utc

您在正確的軌道上。 為了使randomSeconds正常工作,您需要做的就是將NominalDiffTime轉換為秒作為Int並且由於NominalDiffTimeNominalDiffTime的實例, RealFrac您可以使用roundfloor等。 另外,您也不想在輔助函數中丟棄生成器,因為以后可能需要它。

import           Data.Bifunctor (first)
import           Data.Time
import           System.Random

randomSeconds :: RandomGen g => g -> NominalDiffTime -> (NominalDiffTime, g)
randomSeconds rg max = first realToFrac $ randomR (0, truncate max :: Int) rg

diff :: TimeZone -> LocalTime -> LocalTime -> NominalDiffTime
diff tz st en = diffUTCTime (localTimeToUTC tz st) (localTimeToUTC tz en)

randomTimeBetween :: RandomGen g =>
  TimeZone -> LocalTime -> LocalTime -> g -> (LocalTime, g)
randomTimeBetween tz s e rg =
  first
    (utcToLocalTime tz . (`addUTCTime` (localTimeToUTC tz s)))
    (randomSeconds rg (diff tz s e))

main :: IO ()
main = do
  gen <- getStdGen
  tz <- getCurrentTimeZone
  nowUTC <- getCurrentTime
  let yesterday = utcToLocalTime tz $ addUTCTime (-1 * 3600 * 24) nowUTC
      between =
        fst $ randomTimeBetween tz yesterday (utcToLocalTime tz nowUTC) gen
  putStrLn $ "Yesterday: " ++ show yesterday
  putStrLn $ "In between: " ++ show between
  putStrLn $ "Now: " ++ show (utcToLocalTime tz nowUTC)

據我了解,該文檔在NominalDiffTimeNum實現中提供了fromInteger :: Integer -> NominalDiffTime

因此:生成適當范圍的Integer ,將其轉換為NominalDiffTime並將其添加到您的時間值中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM