.NET Roundtrip时区转换不匹配(IsAmbiguousTime问题?)

时间:2012-02-24 12:53:23

标签: c# timezone dst

这次往返失败我怀疑由于中间时间不明确。有什么可以做的吗?它与以下结果不匹配:

http://www.timeanddate.com/worldclock/converted.html?month=11&day=6&year=2011&hour=1&min=59&sec=0&p1=179&p2=75

这只是巧合,.NET选择了一个可能模棱两可的时间,而网站选择了另一个,这是我预期的那个?

我认识到解决方案是以UTC格式存储时间,但我正在处理遗留应用。

public const string EASTERN_TIMEZONEID = "Eastern Standard Time";
public const string MOUNTAIN_TIMEZONEID = "Mountain Standard Time";

[TestMethod]
public void MountainToEasternToMountain_DaylightSavings_Test()
{
    DateTime originalTime = new DateTime(2011, 11, 5, 23, 59, 0);   //  November 5, 2011 - 11:59pm
    DateTime expectedMiddle = new DateTime(2011, 11, 6, 1, 59, 0);  //  November 6, 2011 - 1:59am
    DateTime expectedEnd = originalTime;                            //  November 5, 2011 - 11:59pm

    TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById(EASTERN_TIMEZONEID);
    TimeZoneInfo mountainTimeZone = TimeZoneInfo.FindSystemTimeZoneById(MOUNTAIN_TIMEZONEID);

    var middleTime = TimeZoneInfo.ConvertTime(originalTime, mountainTimeZone, easternTimeZone);

    var isSourceAmbiguous = mountainTimeZone.IsAmbiguousTime(originalTime);
    var isMiddleAmbiguous = easternTimeZone.IsAmbiguousTime(middleTime);

    Assert.AreEqual(expectedMiddle, middleTime);

    var destTime = TimeZoneInfo.ConvertTime(middleTime, easternTimeZone, mountainTimeZone);

    var isMiddleSourceAmbiguous = easternTimeZone.IsAmbiguousTime(middleTime);
    var isDestAmbiguous = mountainTimeZone.IsAmbiguousTime(destTime);

    Assert.AreEqual(expectedEnd, destTime);
}     

1 个答案:

答案 0 :(得分:1)

  

这次往返失败我怀疑由于中间时间不明确。有什么可以做的吗?

如果你想把事情保存在代表当地时间的DateTime中,那就没有了。从根本上说,你正在丢失数据:有两个输入值映射到相同的输出值,这显然禁止了圆形跳闸。

我假设作为遗留应用程序禁止使用Noda Time的可能性,这样可以更明智地处理所有这些......

大局是什么并不清楚,但是你无法摆脱从一个时区的本地时间(没有偏移)转换到另一个本地时间或从根本上转换为普遍时间的事实有三种可能的结果:

  • 2结果:当地时间发生两次
  • 1结果:当地时间明确无误
  • 0结果:跳过本地时间