2012-11-20 7 views
3

즉, 파이썬의 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

언제부터? 초와 밀리 초? 아마도 여기에 어딘가에 숨어있는 신기원 (시간 0)이있을 것입니다. UTCTime에서 기점을 뺀 다음 NominalDiffTime을 가져온 다음 그 시간에서 초와 밀리 초를 추출합니다. 물론

secondsSince :: UTCTime -> UTCTime -> (Integer, Int) 
secondsSince t0 t1 = (i, round $ d * 1000) 
    where (i, d) = properFraction $ diffUTCTime t1 t0 

당신은 아마 T0는 NominalDiffTime을 반환 당신이 Data.Time.Clock.POSIX을 가져 utcTimeToPOSIXSeconds을 사용하는 경우 1/1/1970 (유닉스 시대), 싶어요.

NominalDiffTime은 Fractional과 Num의 인스턴스이며, 모든 일반 숫자 연산자를 조작 할 때 액세스 할 수 있습니다. 산술적 관점 (변환 포함)에서 이것은 몇 초로 간주됩니다.

유닉스는 윤초가 없기 때문에 근본적으로 잘못된 시간을 갖습니다. 몇 년마다 보통 86400 대신에 86401 초가 걸리는 날이있었습니다. 70 년대에이 사실을 알 필요가있는 컴퓨터에 대한 생각은 어리석은 것처럼 보였습니다 (시계는 일반적으로 기계 시계를 컨설팅하는 sysadmin에 의해 설정 됨). Unix time_t는 신기원 이후의 초를 단순히 계산하고 매일 정확하게 86400 초라고 가정합니다. NominalDiffTime은 동일한 가정을하기 때문에 "공칭"입니다.

옳은 일은 자정 이후 날 번호와 초가있는 구조체를 timefield로 만들고 시간 계산 함수가 윤초 테이블을 참조하도록했을 것입니다. 그러나 새로운 윤년 초가 너무나 자주 지정되어 프로그램마다 다른 시간에 실행될 때 다른 결과를 낼 수 있으므로 단점이 있습니다. 또는 하스켈 용어로 표현하자면 "diffUTCTime"은 IO 모나드에서 결과를 반환해야합니다.

관련 문제