Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

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




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 4/6/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13697정성태7/26/2024386닷넷: 2283. C# - async 메서드에서의 lock/Monitor.Enter/Exit 잠금 처리파일 다운로드1
13696정성태7/26/2024297오류 유형: 920. dotnet publish - error NETSDK1047: Assets file '...\obj\project.assets.json' doesn't have a target for '...'
13695정성태7/25/2024327닷넷: 2282. C# - Lock / Wait 상태에서도 STA COM 메서드 호출 처리파일 다운로드1
13694정성태7/25/2024306닷넷: 2281. C# - ASP.NET Core Web App의 Request 용량 상한값 (Kestrel, IIS)
13693정성태7/24/2024457개발 환경 구성: 717. Visual Studio - C# 프로젝트에서 레지스트리에 등록하지 않은 COM 개체 참조 및 사용 방법파일 다운로드1
13692정성태7/24/2024458디버깅 기술: 199. Windbg - 리눅스에서 뜬 닷넷 응용 프로그램 덤프 파일에 포함된 DLL의 Export Directory 탐색
13691정성태7/23/2024521디버깅 기술: 198. Windbg - 스레드의 Win32 Message Queue 정보 조회
13690정성태7/23/2024533오류 유형: 919. Visual C++ 리눅스 프로젝트 - error : ‘u8’ was not declared in this scope
13689정성태7/22/2024526디버깅 기술: 197. Windbg - PE 포맷의 Export Directory 탐색
13688정성태7/21/2024661닷넷: 2280. C# - Lock / Wait 상태에서도 일부 Win32 메시지 처리파일 다운로드1
13687정성태7/19/2024675닷넷: 2279. C# - PostThreadMessage로 보낸 메시지를 Windows Forms에서 수신하는 방법파일 다운로드1
13686정성태7/19/2024625오류 유형: 918. Visual Studio - ATL Simple Object 추가 시 error C2065: 'IDR_...': undeclared identifier
13685정성태7/19/2024694스크립트: 66. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법 - 두 번째 이야기
13684정성태7/19/2024865닷넷: 2278. C# - 문자열 보간식 사례
13683정성태7/18/2024876오류 유형: 917. ClrMD - Linux 환경의 .NET 5 덤프 분석 시 hang 현상
13682정성태7/18/2024944닷넷: 2277. WPF - 스레드에 종속되는 DependencyObject파일 다운로드1
13681정성태7/17/20241014닷넷: 2276. C# 13 - (2) 메서드 그룹의 자연 타입 개선 (메서드 추론 개선)파일 다운로드1
13680정성태7/16/20241030닷넷: 2275. C# - Method Group, Natural Type, function_type파일 다운로드1
13679정성태7/16/20241040Linux: 75. Linux - C++ (getaddrinfo 등을 담고 있는) libnss 정적 링크
13678정성태7/15/2024898VS.NET IDE: 191. Visual Studio 2022 - .NET 5 프로젝트를 Docker Support로 실행했을 때 오류
13677정성태7/15/20241032오류 유형: 916. MSBuild - CheckEolTargetFramework (warning NETSDK1138)
13676정성태7/14/2024996Linux: 75. gdb에서 glibc의 함수에 Breakpoint 걸기
13675정성태7/13/2024988C/C++: 166. C/C++ - DLL에서 template 함수를 export하는 방법파일 다운로드1
13674정성태7/13/20241042오류 유형: 915. Unhandled Exception: Microsoft.Diagnostics.NETCore.Client.ServerNotAvailableException: Unable to connect to Process
13673정성태7/11/20241065닷넷: 2274. C# 13 - (1) 신규 이스케이프 시퀀스 '\e'파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...