성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
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'>C# - 시스템 Time Zone 변경 시 이벤트 알림을 받는 방법</h1> <p> 아래와 같은 트윗이 떴군요. ^^<br /> <br /> <blockquote class="twitter-tweet"><p lang="ko" dir="ltr">흥미로워서 파이썬도 실험을 해봤는데,<br>time.localtime은 타임존을 머신 설정 변경 이후에도 실시간 반영함. 반면에 time.tzname은 그렇지 않음. 모듈 초기화 시점에 설정된 값을 쓰기 때문에 리프래시된 값을 쓰고 싶으면<br>time.tzset()을 써야함. <a href="https://t.co/uahJ0p7LaF">https://t.co/uahJ0p7LaF</a></p>— Dong-hee Na (@dongheena92) <a href="https://twitter.com/dongheena92/status/1702120302371901497?ref_src=twsrc%5Etfw">September 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <br /> 닷넷은 어떨까요? ^^<br /> <br /> 우선, 현재 시스템의 Time Zone은 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.local'>TimeZoneInfo.Local</a>을 이용해 구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > namespace ConsoleApp1; internal class Program { static void Main(string[] args) { while (true) { Console.WriteLine(<span style='color: blue; font-weight: bold'>TimeZoneInfo.Local</span>); // TimeZone.CurrentTimeZone은 deprecated Thread.Sleep(1000); } } } /* 출력 결과 (UTC+09:00) Seoul ...[생략]... */ </pre> <br /> 위와 같이 실행한 상태에서 Settings / "Time & language" 설정에 들어가 "Date & time"에서 "Time zone"을 바꾸면,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='current_time_zone_1.png' src='/SysWebRes/bbs/current_time_zone_1.png' /><br /> <br /> 콘솔 화면에는 여전히 "(UTC+09:00) Seoul"로 찍히는 것을 볼 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 아쉽게도, C# 역시 시스템의 Time zone에 대해 실시간 반영하는 방법은 없고, 대신에 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.timezoneinfo.local'>공식 문서</a>에도 나오듯이,<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> You should always access the local time zone through the TimeZoneInfo.Local property rather than assigning the local time zone to a TimeZoneInfo object variable. This prevents the TimeZoneInfo object variable from being invalidated by a call to the ClearCachedData method.<br /> </div><br /> <br /> 필요한 경우 ClearCachedData를 호출해야 합니다. 따라서 다음과 같이 코드를 바꾸면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > namespace ConsoleApp1; internal class Program { static void Main(string[] args) { while (true) { Console.WriteLine($"{TimeZoneInfo.Local}"); <span style='color: blue; font-weight: bold'>TimeZoneInfo.ClearCachedData();</span> Thread.Sleep(1000); } } } /* 출력 결과: (UTC+09:00) Seoul ...[생략]... (UTC+09:30) Adelaide ...[생략]... */ </pre> <br /> 중간에 시스템의 Time Zone 변화를 반영하는 것을 볼 수 있습니다. 사실, 파이썬의 경우에도 Time Zone의 변경에 대한 알림을 받는 것은 아닐 것이므로 어차피 위의 코드와 비교해 그다지 차이가 없다고 봐야 할 것입니다.<br /> <a name='tz_reg'></a> <br /> 참고로, Settings에서 변경한 Time Zone 정보는 레지스트리에 곧바로 반영됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation </pre> <br /> // 서울인 경우<br /> <img onclick='toggle_img(this)' class='imgView' alt='current_time_zone_2.png' src='/SysWebRes/bbs/current_time_zone_2.png' /><br /> <br /> // Adelaide인 경우<br /> <img onclick='toggle_img(this)' class='imgView' alt='current_time_zone_3.png' src='/SysWebRes/bbs/current_time_zone_3.png' /><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;' > C# - 특정 레지스트리 변경 시 알림을 받는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12621'>https://www.sysnet.pe.kr/2/0/12621</a> </pre> <br /> 이런 식으로 처리할 수는 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using Microsoft.Win32; using System.Management; namespace ConsoleApp1; // Nuget 패키지 참조 // Install-Package System.Management internal class Program { static void Main(string[] args) { Console.WriteLine($"{TimeZoneInfo.Local}"); <span style='color: blue; font-weight: bold'>using (RegistryMonitor regMon = new RegistryMonitor(Registry.LocalMachine, @"SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation")) { regMon.Changed += registry_Changed; do { Console.WriteLine("Press 'q' key to exit..."); } while (Console.ReadLine() != "q"); }</span> } <span style='color: blue; font-weight: bold'>private static void registry_Changed(object sender, EventArrivedEventArgs e) { TimeZoneInfo.ClearCachedData(); Console.WriteLine($"{TimeZoneInfo.Local}"); }</span> } public class RegistryMonitor : IDisposable { // 참고: <a target='tab' href='https://www.sysnet.pe.kr/2/0/12621'>https://www.sysnet.pe.kr/2/0/12621</a> } </pre> <br /> (아쉽게도 Time Zone 변경에 대해 <a target='tab' href='https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa'>SystemParametersInfo Win32 API</a>를 사용하지 않는 듯합니다. 그런 탓에 <a target='tab' href='https://www.sysnet.pe.kr/2/0/13027'>WM_SETTINGCHANGE 알림</a>은 발생하지 않습니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 마지막으로, 윈도우의 Shell Prompt 명령어로는 tzutil을 사용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows - Time zone 설정을 바꿔도 반영이 안 되는 경우 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12337'>https://www.sysnet.pe.kr/2/0/12337</a> </pre> </p><br /> <br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
9214
(왼쪽의 숫자를 입력해야 합니다.)