[英]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
並且由於NominalDiffTime
是NominalDiffTime
的實例, RealFrac
您可以使用round
, floor
等。 另外,您也不想在輔助函數中丟棄生成器,因為以后可能需要它。
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)
據我了解,該文檔在NominalDiffTime
的Num
實現中提供了fromInteger :: Integer -> NominalDiffTime
。
因此:生成適當范圍的Integer
,將其轉換為NominalDiffTime
並將其添加到您的時間值中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.