如何更改UTC时区并获取实际时间?

时间:2015-10-14 06:31:00

标签: c# datetime timezone utc

我想要实现的是,通过使用int值,更改UTC日期时间并从不同时区接收时间。

Int值应该是:

0 = UTC+00:00
1 = UTC+01:00
...

按逻辑,它应该是这样的:

int timezoneInt = 1;
var newDate = DateTime.UtcNow.AddMinutes(timezoneInt*60);

但问题是这不包括夏季/冬季时间。

例如:

我的位置是UTC + 02:00,时间是09:20 AM。我需要得到UTC + 00:00(等于DateTime.UtcNow应该是(?) 07:20 AM)。由于夏天的时间,现在.UtcNow是06:20 AM,所以我不能将60分钟乘以int值,我还需要以某种方式包括夏令时因素。

我是如何实现这一目标的,或者我所缺少的或是什么?

修改 被标记为dublicate。好吧,here我没有看到任何有助于通过使用int值作为时区来改变时间的东西。

2 个答案:

答案 0 :(得分:1)

夏令时的调整需要一个广泛的时区数据库,该数据库还记录该区域变为夏令时的日期和时间,以及新的UTC偏移量。

DST数据库不容易构建(甚至在某些情况下使用),必须手动研究和维护,因为它们是政治的,而不是技术的 - 各国可以按照自己的意愿改变夏令时,因此数据库也需要记录历史日期。

.NET Framework有一个内置的TimeZoneInfo类(它废弃了TimeZone类),它使用内置于Windows或任何主机操作系统的时区数据库。的Windows' timezone数据库使用全名来标识区域,而Linux和tzdb使用America/New_York等ID。

请注意,通常您不应该自己执行这些计算,因为总有许多边缘情况需要注意。只需使用DateTimeOffset

此外, UTC偏移和时区之间的1:1映射:不同的时区共享相同的UTC偏移但具有不同的夏令时规则(例如,英国时区时区使用UTC + 0作为他们正常的UTC偏移但是夏天的UTC + 1,但如果你看到" UTC + 1"它可能是夏季的英国区域,也可能是西非时区,例如阿尔及利亚的UTC +1,但根本不使用夏令时。

答案 1 :(得分:0)

the timezone tag wiki逐字复制:

  

时区!=偏移

     

时区不能仅由UTC的偏移量表示。由于daylight saving time(又名"夏令时")规则,许多时区都有多个偏移量。抵消变化的日期也是时区规则的一部分,任何历史偏移变化也是如此。许多软件程序,库和Web服务忽略了这一重要细节,并错误地将标准或当前偏移称为“区域”#34;。这可能导致混淆和滥用数据。请尽可能使用正确的术语。

     
      
  • 偏移量只是一个数字,表示特定日期/时间值在UTC之前或之后的距离。      
        
    • 大多数抵消都以整个小时表示。
    •   
    • 但有许多是30分钟的抵消。
    •   
    • 还有一个很少,这是45分钟的偏移。
    •   
  •   
  • 时区包含更多内容:      
        
    • 可用于识别区域的名称或ID。
    •   
    • UTC的一个或多个偏移
    •   
    • 区域在偏移之间转换的特定日期和时间。
    •   
    • 有时,可以向用户显示单独的特定于语言的显示名称。
    •   
  •   
     

在给定时区和日期时间的情况下,可以确定正确的偏移量。但是只有一个无法确定正确的时区。

您正在问如何忽略这一事实并使其仍然有效 - 这是不可能的。你不能使用整数偏移量并希望它能够理解夏令时。试图打败这种情况的任何解决方案都会偏向于一组特定的夏令时规则,这些规则在不同国家/地区之间存在很大差异。