성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] What has case distinction but is ne...
[정성태] 대소문자 '변환'과 함께 따라오는 문제가 바로 대소문자 구분 없...
[정성태] Reverse-engineering what a "short" ...
[정성태] 윈도우의 경우, 스레드 관련 자원을 완전히 회수하기 위해 Thr...
[지현명] Android쪽에서 activity 접근 할때 아래꺼 적어 놓고...
[지현명] Maui.Android에서 폴더 관련 내용 정리 잘 되어 있네요...
[정성태] @정한솔 언급하신 사항이 맞습니다. (C# 13부터) 중간에 i...
[정한솔] 기존 printAll(params int[] args)를 pri...
[정성태] 제가 거기까지는 테스트를 안 해봤군요. ^^ 재미 삼아 저 당시...
[정재겸] 질문이 하나 더 있습니다. 처음에 키보드 인풋은 먹다가 마...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법</h1> <p> 파이썬의 <a target='tab' href='https://docs.python.org/3/library/time.html#time.time'>time.time()</a>은,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > import time print(time.time()) # 1680616014.57 </pre> <br /> 문서에 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12849'>epoch time</a>의 부동소수점 형식이라고 합니다. 일단 정수 영역은 초 단위이고, 소수점 이하는 초 단위 이하의 정밀도를 나타냅니다. 가령, 위의 경우 0.5는 5/10초이고, 0.07은 7/100초입니다.<br /> <br /> 제 Windows에서 여러 차례 시도해 보면, 소수점 7자리까지 나오는데요 따라서 1/10 마이크로초 단위, 즉 100 나노 초까지 나옵니다. 그런데 어딘가 좀 익숙한 단위죠. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - nano 시간을 가져오는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/13036'>https://www.sysnet.pe.kr/2/0/13036</a> </pre> <br /> (time.time이 반환하는 정밀도는 시스템마다 다를 수 있다는 것을 염두에 둬야 합니다.)<br /> <br /> 자, 그렇다면 이제 저 값을 밀리 초, 마이크로 초까지 변환하는 것을 쉽게 할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > milli_time = int(time.time() * 1000) micro_time = int(time.time() * 1000000) </pre> <br /> 비록 time.time() 값이 100 나노 초 단위까지 값을 생성하긴 하지만 이 값을 datetime 등으로 변환하면 마이크로 초 단위에서 잘립니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > from datetime import datetime print(datetime.fromtimestamp(1680616014.<span style='color: blue; font-weight: bold'>7561996</span>)) # 2023-04-04 22:46:54.<span style='color: blue; font-weight: bold'>756200</span> print(datetime.fromtimestamp(1680616014.75)) # 1680616014.750000 print(datetime.fromtimestamp(1680616014.750000)) # 1680616014.750000 print(datetime.fromtimestamp(1680616014.000075)) # 1680616014.000075 </pre> <br /> <hr style='width: 50%' /><br /> <br /> 파이썬의 time 값 구조를 알았다면 이제 이것을 Go 언어에서 읽는 것은 어렵지 않습니다. Go에서는 Epoch 시간을 Milli와 Micro 초 단위로 읽는 함수가 있기 때문에,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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 } </pre> <br /> 위와 같이 처리하면 됩니다. 한 가지 가벼운 문제가 있다면, 파이썬의 datetime.fromtimestamp은 100 나노 초에 대해 반올림을 하지만 위의 Go - int64 처리는 버림을 하기 때문에 굳이 이것을 맞춰야 한다면 다음과 같이 추가 처리를 해주시면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > timeValue := math.Round(value) fmt.Printf("%v\n", time.UnixMicro(int64(timeValue))) </pre> <br /> <hr style='width: 50%' /><br /> <br /> 간단하게 C#으로도 알아볼까요? ^^ 우선 밀리 초 단위까지만 보존해도 된다면 간단하게 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset'>DateTimeOffset</a>을 쓰면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > double value = 1680616014.7561996; value *= 1000; // 밀리 초로 변환 Console.WriteLine(DateTimeOffset.<a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset.fromunixtimemilliseconds'>FromUnixTimeMilliseconds</a>((long)value).UtcDateTime); // 출력: 2023-04-04 오후 1:46:54 </pre> <br /> 반면 100나노 초까지 그대로 반영하고 싶다면 time.time()의 결과를 100 나노 단위로 올리고 Epoch Ticks 만큼의 크기를 더해주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 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 </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4303
(왼쪽의 숫자를 입력해야 합니다.)