파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법
파이썬의 time.time()은,
import time
print(time.time()) # 1680616014.57
문서에
epoch time의 부동소수점 형식이라고 합니다. 일단 정수 영역은 초 단위이고, 소수점 이하는 초 단위 이하의 정밀도를 나타냅니다. 가령, 위의 경우 0.5는 5/10초이고, 0.07은 7/100초입니다.
제 Windows에서 여러 차례 시도해 보면, 소수점 7자리까지 나오는데요 따라서 1/10 마이크로초 단위, 즉 100 나노 초까지 나옵니다. 그런데 어딘가 좀 익숙한 단위죠. ^^
C# - nano 시간을 가져오는 방법
; https://www.sysnet.pe.kr/2/0/13036
(time.time이 반환하는 정밀도는 시스템마다 다를 수 있다는 것을 염두에 둬야 합니다.)
자, 그렇다면 이제 저 값을 밀리 초, 마이크로 초까지 변환하는 것을 쉽게 할 수 있습니다.
milli_time = int(time.time() * 1000)
micro_time = int(time.time() * 1000000)
비록 time.time() 값이 100 나노 초 단위까지 값을 생성하긴 하지만 이 값을 datetime 등으로 변환하면 마이크로 초 단위에서 잘립니다.
from datetime import datetime
print(datetime.fromtimestamp(1680616014.7561996)) # 2023-04-04 22:46:54.756200
print(datetime.fromtimestamp(1680616014.75)) # 1680616014.750000
print(datetime.fromtimestamp(1680616014.750000)) # 1680616014.750000
print(datetime.fromtimestamp(1680616014.000075)) # 1680616014.000075
파이썬의 time 값 구조를 알았다면 이제 이것을 Go 언어에서 읽는 것은 어렵지 않습니다. Go에서는 Epoch 시간을 Milli와 Micro 초 단위로 읽는 함수가 있기 때문에,
package main
import (
"fmt"
"time"
)
func main() {
value := 1680616014.7561996
value *= 1000000 // 마이크로 초로 변환
timeValue := int64(value)
fmt.Printf("%v\n", time.UnixMicro(timeValue)) // 2023-04-04 22:46:54.756199 +0900 KST
}
위와 같이 처리하면 됩니다. 한 가지 가벼운 문제가 있다면, 파이썬의 datetime.fromtimestamp은 100 나노 초에 대해 반올림을 하지만 위의 Go - int64 처리는 버림을 하기 때문에 굳이 이것을 맞춰야 한다면 다음과 같이 추가 처리를 해주시면 됩니다.
timeValue := math.Round(value)
fmt.Printf("%v\n", time.UnixMicro(int64(timeValue)))
간단하게 C#으로도 알아볼까요? ^^ 우선 밀리 초 단위까지만 보존해도 된다면 간단하게
DateTimeOffset을 쓰면 됩니다.
double value = 1680616014.7561996;
value *= 1000; // 밀리 초로 변환
Console.WriteLine(DateTimeOffset.FromUnixTimeMilliseconds((long)value).UtcDateTime);
// 출력: 2023-04-04 오후 1:46:54
반면 100나노 초까지 그대로 반영하고 싶다면 time.time()의 결과를 100 나노 단위로 올리고 Epoch Ticks 만큼의 크기를 더해주면 됩니다.
long UnixEpochTicks = 621355968000000000;
double value = 1680616014.7561996;
value *= 10000000; // 100 나노 초로 변환
DateTime date = new DateTime((long)value + UnixEpochTicks, DateTimeKind.Utc);
Console.WriteLine(date); // 2023-04-04 오후 1:46:54
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]