将某人的当地时间转换为UTC时间

时间:2010-08-05 07:31:26

标签: c# .net datetime dst

我在时区有点迷失:)

我的数据存储时间为UTC。 服务器在荷兰,所以我们住的是utc + 1(现在,在daylightavingtime,utc + 2)

现在客户说:给我8月5日的数据。

所以我必须从“他的时间”计算出来的时间。 为此,我必须知道:

你的utc偏移是什么(我们存储在他的个人资料中,让我们说utc -6) 你是在白天节拍时间(因为那时我们必须加+1并使utc偏移-5)

然后我的问题:

  1. 我可以问.Net框架:国家XX是否有白天时间?

  2. 我可以问.Net框架:那个时候国家XXX的白天时间是08-05-2010T00:00:00吗?

  3. 我一直在尝试.ToLocalTime(),但这只给了我服务器的本地时间,这不是我想要的,我想用用户的时区计算,还有事实在那个特定的时间点,如果他/她处于白天时间

    我也看过这个VB例子:

    TimeZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time") 
    Dim Dated As DateTime = TimeZoneInfo.ConvertTimeToUtc(TempDate, TimeZone) 
    

    但imho没有考虑到此时区中的用户是否处于daylightavingtime(dst)国家/地区。 例如,这个时区的一个用户在荷兰有dst,而另一个用户在另一个没有dst的国家。

3 个答案:

答案 0 :(得分:6)

您无法询问有关特定国家的框架 - 但您可以询问特定的时区

TimeZoneInfo 确实考虑了DST。 (哎呀,它不会有IsDaylightSavingTime方法。)如果你有两个用户,其中一个正在观察DST而另一个没有,那么他们不是在同一时区。

如果您可以指定您正在谈论的位置,我可以尝试找出涉及哪些时区。 (通常更容易找到Olson名称,但找不到Windows ID应该不可能。)

答案 1 :(得分:2)

TimeZone类有一个方法IsDaylightSavingTime,它以日期作为参数 并返回一个布尔值,指示该日期是否为该时区的白天时间。

答案 2 :(得分:2)

我将评论推广到答案。 这似乎是一个复杂的问题。看看http://www.timeanddate.com/time/dst2010.html,世界各个国家都有一张DST表。你不能用静态代码来解决这个问题,因为DST不仅会改变国家/地区,也会逐年改变。

我猜你必须维护一个包含DST信息的表并从中获取信息。

或者您可以查询网络服务以获取此类信息。

查看http://www.earthtools.org/webservices.htm#timezone您可以查询的网络服务,以便在考虑DST的各个国家/地区获取时间(仅适用于西欧时区)。 另请参阅http://www.geonames.org/export/web-services.html。您必须让您的用户地理位置使用这些服务。