2012-11-20 209 views
3

換句話說,我正在尋找相當於Python的datetime.utcnow()Haskell:將UTCTime轉換爲秒和毫秒

我也很好,包含幾年,幾個月等等,直到毫秒(或微秒)的n元組。

我曾想過使用show,然後解析String值,但我相信有更方便的東西。

+3

相關:http://stackoverflow.com/questions/4194340/is-there-a-better-way-to-convert-from-utctime-to-epochtime – katrielalex

回答

4

重新解析一個字符串是非常不Haskellish,你當然不希望這樣。

我會用,從Data.Time.LocalTime

todSec . localTimeOfDay . utcToLocalTime utc 

,讓你秒皮秒分辨率。

0

從什麼時候開始秒和毫秒?據推測,這裏隱藏着一個時代(零時間)。您從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中的結果。