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)
13126정성태9/15/20225430.NET Framework: 2049. C# 11 - 정적 메서드에 대한 delegate 처리 시 cache 적용
13125정성태9/14/20225591.NET Framework: 2048. C# 11 - 구조체 필드의 자동 초기화(auto-default structs)
13124정성태9/13/20225289.NET Framework: 2047. Golang, Python, C#에서의 CRC32 사용
13123정성태9/8/20225755.NET Framework: 2046. C# 11 - 멤버(속성/필드)에 지정할 수 있는 required 예약어 추가
13122정성태8/26/20225705.NET Framework: 2045. C# 11 - 메서드 매개 변수에 대한 nameof 지원
13121정성태8/23/20223891C/C++: 157. Golang - 구조체의 slice 필드를 Reflection을 이용해 변경하는 방법
13120정성태8/19/20225033Windows: 209. Windows NT Service에서 UI를 다루는 방법 [3]
13119정성태8/18/20224806.NET Framework: 2044. .NET Core/5+ 프로젝트에서 참조 DLL이 보관된 공통 디렉터리를 지정하는 방법
13118정성태8/18/20223856.NET Framework: 2043. WPF Color의 기본 색 영역은 (sRGB가 아닌) scRGB [2]
13117정성태8/17/20225666.NET Framework: 2042. C# 11 - 파일 범위 내에서 유효한 타입 정의 (File-local types)파일 다운로드1
13116정성태8/4/20226009.NET Framework: 2041. C# - Socket.Close 시 Socket.Receive 메서드에서 예외가 발생하는 문제파일 다운로드1
13115정성태8/3/20226413.NET Framework: 2040. C# - ValueTask와 Task의 성능 비교 [1]파일 다운로드1
13114정성태8/2/20226461.NET Framework: 2039. C# - Task와 비교해 본 ValueTask 사용법파일 다운로드1
13113정성태7/31/20225867.NET Framework: 2038. C# 11 - Span 타입에 대한 패턴 매칭 (Pattern matching on ReadOnlySpan<char>)
13112정성태7/30/20226259.NET Framework: 2037. C# 11 - 목록 패턴(List patterns) [1]파일 다운로드1
13111정성태7/29/20226105.NET Framework: 2036. C# 11 - IntPtr/UIntPtr과 nint/nuint의 통합파일 다운로드1
13110정성태7/27/20226148.NET Framework: 2035. C# 11 - 새로운 연산자 ">>>" (Unsigned Right Shift)파일 다운로드1
13109정성태7/27/20227196VS.NET IDE: 177. 비주얼 스튜디오 2022를 이용한 (소스 코드가 없는) 닷넷 모듈 디버깅 - "외부 원본(External Sources)" [1]
13108정성태7/26/20225430Linux: 53. container에 실행 중인 Golang 프로세스를 디버깅하는 방법 [1]
13107정성태7/25/20224966Linux: 52. Debian/Ubuntu 계열의 docker container에서 자주 설치하게 되는 명령어
13106정성태7/24/20224618오류 유형: 819. 닷넷 6 프로젝트의 "Conditional compilation symbols" 기본값 오류
13105정성태7/23/20225632.NET Framework: 2034. .NET Core/5+ 환경에서 (프로젝트가 아닌) C# 코드 파일을 입력으로 컴파일하는 방법 - 두 번째 이야기 [1]
13104정성태7/23/20228286Linux: 51. WSL - init에서 systemd로 전환하는 방법
13103정성태7/22/20225376오류 유형: 818. WSL - systemd-genie와 관련한 2가지(systemd-remount-fs.service, multipathd.socket) 에러
13102정성태7/19/20224821.NET Framework: 2033. .NET Core/5+에서는 구할 수 없는 HttpRuntime.AppDomainAppId
13101정성태7/15/202211650도서: 시작하세요! C# 10 프로그래밍
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...