EWS Managed API Timezone "Невозможно конвертировать"

Я использую EWS Managed API 2.1 и инициализировал свой ExchangeService со всеми системными часовыми поясами, найденными на моем сервере IIS Win 2008 R2 (немецкий) с современным уровнем исправлений:

EWS ews;
string s = "";
foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones()) {
  try {
    ews = new ExchangeService(ExchangeVersion.Exchange2010, tz);
    ews.Credentials = new WebCredentials("alex@contoso.com", "password");
    ews.AutodiscoverUrl("alex@contoso.com");
    Appointment app = new Appointment(ews);
    app.Start = DateTime.Now;
    app.End = DateTime.Now.AddMinutes(15);
    app.Subject = tz.Id;
    app.Save();
  } catch(Exception ex) { s += ex.Message + "\n"; }
}

Я получаю ошибки с некоторыми часовыми поясами. Сообщения об ошибках:

Unable to convert 2009-01-01T00:00:00.000 from (UTC-03:00) Buenos Aires to UTC.
Unable to convert 2012-01-01T00:00:00.000 from (UTC-03:00) Salvador to UTC.
Unable to convert 2012-01-01T00:00:00.000 from (UTC+02:00) Tripolis to UTC.
Unable to convert 2009-01-01T00:00:00.000 from (UTC+04:00) Port Louis to UTC.
Unable to convert 2009-01-01T00:00:00.000 from (UTC+08:00) Perth to UTC.

Может ли кто-нибудь объяснить мне, как можно проще,

  • почему эти преобразования пробуются кодом dll?
  • почему они потерпят неудачу?
  • Можно ли как-нибудь обойти эту проблему?

2 ответа

Это ошибка в.Net https://connect.microsoft.com/VisualStudio/feedback/details/1027179/timezone-conversion-bug

Я использовал этот обходной путь

        var timeZoneInfo = GetWorkaroundTimeZone(TimeZoneInfo.Local);
        var appointment = new Appointment(service)
                          {
                              Subject = subject,
                              Body = body,
                              Start = start,
                              StartTimeZone =  timeZoneInfo,
                              End = end,
                              EndTimeZone = timeZoneInfo
                          };

    private static TimeZoneInfo GetWorkaroundTimeZone(TimeZoneInfo timeZone)
    {
        try
        {
            TimeZoneInfo.ConvertTime(new DateTime(2014, 1, 1), timeZone, TimeZoneInfo.Utc);
            TimeZoneInfo.ConvertTime(new DateTime(2012, 1, 1), timeZone, TimeZoneInfo.Utc);
            TimeZoneInfo.ConvertTime(new DateTime(2009, 1, 1), timeZone, TimeZoneInfo.Utc);
            return TimeZoneInfo.Local;
        }
        catch (Exception ex)
        {
            return TimeZoneInfo.CreateCustomTimeZone(
                "Time zone to workaround bug",
                timeZone.BaseUtcOffset,
                "Time zone to workaround bug",
                "Time zone to workaround bug");
        }
    }

Это всего лишь предположение, но это может быть связано с DateTime.Now имеющего "местный" вид, когда вы используете другой часовой пояс. Попробуйте указать время в целевом часовом поясе:

var now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
app.Start = now;
app.End = now.AddMinutes(15);

Вы также можете явно указать начальный и конечный часовые пояса. Я не уверен, имеет ли это значение или нет, но вы можете проверить:

app.StartTimeZone = tz;
app.EndTimeZone = tz;

Извините, у меня нет сервера Exchange, пригодного для проверки этих предположений, но вы можете попробовать проверить, подходит ли он вам.

Другие вопросы по тегам