Несоответствие преобразования часового пояса .NET Roundtrip (проблема IsAmbiguousTime?) - PullRequest
1 голос
/ 24 февраля 2012

Я подозреваю, что это путешествие туда и обратно не получается из-за неоднозначности результирующего среднего времени. Есть ли что-нибудь, что можно с этим сделать? Не соответствует результату:

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 Ответ

1 голос
/ 24 февраля 2012

Я подозреваю, что это путешествие туда и обратно не получается из-за неоднозначности результирующего среднего времени. Можно ли что-нибудь с этим сделать?

Нет, если вы хотите хранить все в DateTime, представляющем местное время, нет. По сути, вы теряете данные: есть два входных значения, которые отображаются на одно и то же выходное значение, что явно запрещает циклическое отключение.

Я предполагаю, что, будучи унаследованным приложением, он запрещает возможность использовать Noda Time вместо этого, что позволяет обрабатывать все это более разумно ...

Не ясно, какова общая картина, но вы не сможете уйти от того факта, что преобразование из местного времени (без смещения) в один часовой пояс в другое местное время или в универсальное время принципиально имеет три возможных результата:

  • 2 результатов: местное время произошло дважды
  • 1 результат: местное время было однозначным
  • 0 результатов: местное время было пропущено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...