簡體   English   中英

如何從UTCTime獲取秒和毫秒分量?

[英]How to get the seconds and millisecond component from UTCTime?

換句話說,我正在尋找等效於 Python 的datetime.utcnow()

我也可以使用包含年、月等的 n 元組,直到毫秒(或微秒)。

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

重新解析字符串非常不符合 Haskellish,您當然不希望那樣。

我會使用,來自Data.Time.LocalTime

todSec . localTimeOfDay . utcToLocalTime utc  ::  UTCTime -> Data.Fixed.Pico

這給你幾秒鍾的皮秒分辨率。

從什么時候開始的秒和毫秒? 大概有一個時代(零時間)隱藏在這里的某個地方。 您從 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 是“nominal”,因為它做出了相同的假設。

正確的做法是使 time_t 成為一個結構體,其中包含天數和自午夜以來的秒數作為單獨的字段,並讓時間算術函數查詢閏秒表。 然而,這有其自身的一系列缺點,因為每隔一段時間就會指定新的閏秒,因此程序在不同時間運行時可能會給出不同的結果。 或者用 Haskell 術語來說,“diffUTCTime”必須在 IO monad 中返回結果。

暫無
暫無

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

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