如何使用 FindSystemTimeZoneById 获取元区域的时区?

发布于 2024-10-15 05:36:28 字数 463 浏览 4 评论 0原文

我获得了 TzID(Olson tzid 格式 Exp:“欧洲/哥本哈根”)。之后,我尝试使用 c# TimeZonInfo 类将某些 DateTime 从该时区(与服务器本地时区不同)转换为 UTC。

我想知道为什么窗口的时区 ID 只有大约 100,而 Olson 的时区 ID tz 数据库大约有 405 个 tz id。假设时区“欧洲/哥本哈根”,我不知道如何使用 FindSystemTimeZonebyID 来获取该时区的时区信息(它已在 Olson ID 到 windows ID 转换表)。有人有这方面的经验吗?请帮我。

I was given the TzID (Olson tzid format Exp: "Europe/Copenhagen"). After that, i tried to do the timezone conversion for certain DateTime from that timezone (different with server local time zone) to UTC by using c# TimeZonInfo class.

I was wondering why window's timezone id only have about 100 whereas the timezone id for Olson tz database have about 405 tz id. Lets say for time zone "Europe/Copenhagen", i have no idea how to use the FindSystemTimeZonebyID to get the time zone info for this time zone (It was listed in metazones in the Olson ID to windows ID convertion table). Anyone experienced in this? Please help me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请别遗忘我 2024-10-22 05:36:28

来自 MSDN

FindSystemTimeZoneById 尝试将 id 与 Windows XP 和 Windows 下注册表的 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 分支的子项名称相匹配远景。该分支不一定包含时区标识符的完整列表。

根据您链接到的表,您需要传入字符串 Europe_Central,因为它是 Olson“Europe/Copenhagen”的 Windows 版本。 (请注意,根据 MSDN 文档,它不区分大小写。)如果这不起作用,您应该检查注册表以确保 Europe_Central 条目存在。

有关 Olson tz 数据库及其定义时区的更多信息,请参阅 wikipedia


更新 1:

我的注册表 (Vista) 将其列为中欧标准时间,这是我需要作为参数传递的字符串,您有类似的条目吗?

如果您的注册表中没有该条目,您可以自己创建使用此处中的信息,尽管看起来您必须构建夏季时间的规则(请参阅链接)。

您还可以尝试使用 DateTimeOffset 与保存本地服务器时间的 DateTime 并传入 +1 小时 (CET) 的 TimeSpan

根据您想要执行的操作,您也可以从 CET 时间中减去一小时来获取 UTC。 (尽管中欧夏令时间生效后这将不起作用;那么您需要减去两个小时。)

From MSDN:

FindSystemTimeZoneById tries to match id to the subkey names of the HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones branch of the registry under Windows XP and Windows Vista. This branch does not necessarily contain a comprehensive list of time zone identifiers.

Based on the table you link to, you want to pass in the string Europe_Central, since it is the Windows version of the Olson "Europe/Copenhagen". (Note that according to the MSDN docs, it is not case sensitive.) If that doesn't work, you should check your registry to ensure the Europe_Central entry exists.

For more on the Olson tz database and how it defines timezones, see wikipedia.


Update 1:

My registry (Vista) has it listed as Central Europe Standard Time, which is the string I'd need to pass in as the parameter, do you have a similar entry?

If that entry isn't in your Registry, you can create it yourself using info from here, though it looks like you'd have to construct the rules for summer time (see the link).

You could also try using a DateTimeOffset with a DateTime holding the local server time and passing in a TimeSpan of +1 hour (CET).

Depending on what you're trying to do, you can also just subtract one hour from the CET time to get UTC. (Though that won't work once Central Europe Summer Time takes effect; then you'll need to subtract two hours.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文