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

1

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

EWS ews;
string s = "";
foreach (TimeZoneInfo tz in TimeZoneInfo.GetSystemTimeZones()) {
  try {
    ews = new ExchangeService(ExchangeVersion.Exchange2010, tz);
    ews.Credentials = new WebCredentials("[email protected]", "password");
    ews.AutodiscoverUrl("[email protected]");
    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?
  • почему они потерпят неудачу?
  • как я могу обойти эту проблему?
Теги:
timezone
exchangewebservices
ews-managed-api

2 ответа

0

Это ошибка в.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");
        }
    }
0

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

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

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

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

К сожалению, у меня нет сервера Exchange, чтобы проверить эти предположения, но вы можете попробовать и посмотреть, работает ли он на вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню