Я использую 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.
Может ли кто-нибудь объяснить мне, насколько это возможно,
Это ошибка в.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, чтобы проверить эти предположения, но вы можете попробовать и посмотреть, работает ли он на вас.