換句話說,我正在尋找相當於Python的datetime.utcnow()。Haskell:將UTCTime轉換爲秒和毫秒
我也很好,包含幾年,幾個月等等,直到毫秒(或微秒)的n元組。
我曾想過使用show
,然後解析String
值,但我相信有更方便的東西。
換句話說,我正在尋找相當於Python的datetime.utcnow()。Haskell:將UTCTime轉換爲秒和毫秒
我也很好,包含幾年,幾個月等等,直到毫秒(或微秒)的n元組。
我曾想過使用show
,然後解析String
值,但我相信有更方便的東西。
重新解析一個字符串是非常不Haskellish,你當然不希望這樣。
我會用,從Data.Time.LocalTime
,
todSec . localTimeOfDay . utcToLocalTime utc
,讓你秒皮秒分辨率。
從什麼時候開始秒和毫秒?據推測,這裏隱藏着一個時代(零時間)。您從UTCTime中減去紀元以獲得NominalDiffTime,然後從中提取秒和毫秒。
secondsSince :: UTCTime -> UTCTime -> (Integer, Int)
secondsSince t0 t1 = (i, round $ d * 1000)
where (i, d) = properFraction $ diffUTCTime t1 t0
當然,你可能想T0是1/1/1970(Unix紀元),在這種情況下您導入Data.Time.Clock.POSIX和使用utcTimeToPOSIXSeconds,它返回一個NominalDiffTime。
NominalDiffTime是Fractional和Num的一個實例,因此您可以在操作它們時訪問所有常用的數字運算符。從算術角度來看(包括轉換)它被視爲秒數。
當使用這個時,請牢記Unix的時間根本不對,因爲它沒有任何閏秒的空間。每隔幾年就有86401秒,而不是通常的86400.早在70年代,計算機需要了解這一點的想法似乎很荒謬(時鐘通常由系統管理員諮詢他的機械錶),所以Unix time_t只是計算自時代以來的秒數,並假定每天都有86400秒。 NominalDiffTime是「名義上的」,因爲它做出了相同的假設。
正確的做法是將time_t作爲自午夜以來的一個數字和秒作爲單獨字段的結構,並讓時間算術函數查閱閏秒錶。然而,這會有其自身的一些缺點,因爲每隔一段時間就會指定一次新的閏秒,所以程序在不同時間運行時可能會得到不同的結果。或者用Haskell的術語來說,「diffUTCTime」將不得不返回IO monad中的結果。
相關:http://stackoverflow.com/questions/4194340/is-there-a-better-way-to-convert-from-utctime-to-epochtime – katrielalex