使用C#获取当前Windows所设定的时区
2ndgatechina的笔试project:写一个.NET API,能使其他devs能够调用他来将任意时区的时间转换为当前时间或者将当前时间转换为任意时区的时间。
咋一看,好像比较简单,真做的时候才发现我怎么去获取我系统的当前时区呢?上http://www.pinvoke.net上查,发现需要使用kernel32.dll中的GetTimeZoneInformation的系统API。
现成的例子参看这里,我就不详细说了:http://www.pinvoke.net/default.aspx/kernel32.GetTimeZoneInformation
在这个基础上我们来扩展一下:如何去取得windows所给我们设定的全部时区呢?
其实windows所设定的时区全部保存在 \KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones的目录里,那么很自然我们有代码:
1
RegistryKey key = Registry.LocalMachine.OpenSubKey(
2
@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" ) )
3
{
4
string[] zoneNames = key.GetSubKeyNames();
5
6
foreach ( string zoneName in zoneNames )
7
{
8
using ( RegistryKey subKey = key.OpenSubKey( zoneName ) )

2

3

4

5

6

7

8

等等,这里的TZI是二进制的,这种又代表什么呢?仍然是上面的pinvoke的链接,可以将这些二进制数据转换为里面所定义的结构体。那么可以通过如下方法枚举出Time Zones的所有子键信息:
1
public static TimeZoneInformation[] EnumZones()
2
{
3
if ( s_zones == null )
4
{
5
lock( s_lockZones )
6
{
7
if ( s_zones == null )
8
{
9
ArrayList zones = new ArrayList();
10
11
using ( RegistryKey key =
12
Registry.LocalMachine.OpenSubKey(
13
@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" ) )
14
{
15
string[] zoneNames = key.GetSubKeyNames();
16
17
foreach ( string zoneName in zoneNames )
18
{
19
using ( RegistryKey subKey = key.OpenSubKey( zoneName ) )
20
{
21
TimeZoneInformation tzi = new TimeZoneInformation();
22
tzi.m_name = zoneName;
23
tzi.m_displayName = (string) subKey.GetValue( "Display" );
24
tzi.m_standardName = (string) subKey.GetValue( "Std" );
25
tzi.m_daylightName = (string) subKey.GetValue( "Dlt" );
26
tzi.m_index = (int)( subKey.GetValue( "Index" ) );
27
28
tzi.InitTzi( (byte[]) subKey.GetValue( "Tzi" ) );
29
30
zones.Add( tzi );
31
}
32
}
33
}
34
35
s_zones = new TimeZoneInformation[ zones.Count ];
36
37
zones.CopyTo( s_zones );
38
}
39
}
40
}
41
42
return s_zones;
43
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

这样我们便获取到了windows所给我们定义好的时区信息,其中TimeZoneInformation.bias代表我做API中所需要的时间偏移量(单位:分钟),至此,我们就可以做出windows所提供的时区之间的任意转换了。
给一个很好的与此相关的代码资料:http://www.codeproject.com/dotnet/WorldClock.asp
参考资料:
http://www.pinvoke.net
http://www.codeproject.com/dotnet/WorldClock.asp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探