Разница между объектом DateTime, который я создаю, и DateTime.Now

Я пытаюсь использовать API Exchange 2007 для запроса доступности календаря для определенного пользователя. Мой пример кода создает следующее исключение:

Продолжительность времени, указанная для FreeBusyViewOptions.TimeWindow, недействительна.

Вот пример кода:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

service.AutodiscoverUrl("[email protected]");

DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0);

TimeWindow tw = new TimeWindow(startTime, startTime.AddHours(8));

GetUserAvailabilityResults result = service.GetUserAvailability(new List<AttendeeInfo> { new AttendeeInfo("[email protected]") }, tw, AvailabilityData.FreeBusyAndSuggestions);

Странно то, что если я заменю свое назначение startTime следующим, оно сработает:

DateTime startTime = DateTime.Now;

В чем разница между созданным мной объектом DateTime и объектом, созданным DateTime.Now. Я подробно изучил их во время отладки и не нашел разницы.

Любые идеи?


person joshb    schedule 05.01.2012    source источник
comment
date time теперь дает вам текущую дату и время, а дата и время, которые вы указали, - 06.01.2012 7:00:00.   -  person COLD TOLD    schedule 06.01.2012
comment
Я понимаю, что фактическая дата/время отличаются, но даже если я установлю дату/время моего объекта равным Now, у него будет та же проблема.   -  person joshb    schedule 06.01.2012


Ответы (6)


На самом деле это проблема метода GetUserAvailability, а не любых манипуляций с DateTime.

Согласно документации MSDN:

Метод GetUserAvailability(Generic, TimeWindow, AvailabilityData, AvailabilityOptions) поддерживает только периоды времени продолжительностью не менее 24 часов, которые начинаются и заканчиваются в 00:00. Чтобы ограничить результаты метода более коротким периодом времени, необходимо отфильтровать результаты на клиенте.

person competent_tech    schedule 05.01.2012
comment
Спасибо. Я просматривал документацию несколько раз и полностью пропустил это. Странно то, что это не всегда верно (иногда это работает с запуском не в 12 часов ночи и продолжительностью ‹ 24 часа), согласно моему тестированию, но если я остаюсь в этих параметрах, это всегда работает. - person joshb; 06.01.2012
comment
У меня было такое же исключение. Проблема заключалась в том, что мой запрос, который также содержит дату начала и окончания DefineAvailabilityOptions(query), не совпадает с датой начала и окончания, предоставленной в GetUserAvailability. Так что, прежде чем сходить с ума от 24-часового лимита, вы можете сначала проверить это хотя бы. - person Marc Juchli; 04.11.2014

Возможно, это как-то связано с разницей между вашим часовым поясом и UTC, что приводит к отрицательному временному окну. Попробуйте увеличить от AddHours(8) до больших значений вплоть до AddHours(24) и посмотрите, что произойдет.

person Ilya Kogan    schedule 05.01.2012
comment
Ваше предложение устранило исключение (спасибо), но я не совсем понимаю, почему. В любом случае, я добавляю часы к одному и тому же DateTime, так как я могу получить отрицательное временное окно, будь то локальное или UTC? - person joshb; 06.01.2012

Укажите вид, чтобы он был идентичен сейчас:

     DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0, DateTimeKind.Local);

С некоторыми шансами, что вам действительно нужен Utc. Зависит от конфига сервера наверное.

person Hans Passant    schedule 05.01.2012

Я узнаю, что указанное TimeWindow должно содержать хотя бы одну полночь. Но я не знаю, почему.

person Miroslav Jasso    schedule 02.01.2014

Kind отличается. Это может быть то, что он ищет.

new DateTime(2012, 1, 6, 7, 0, 0)

имеет вид «Неопределенное».

Пока

DateTime.Now

имеет вид "Местный".

Попробуйте использовать ToLocalTime, чтобы установить локальный вид:

DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0).ToLocalTime();
person Kekoa    schedule 05.01.2012
comment
Я тоже это заметил во время отладки, но использование метода ToLocalTime или передача DateTimeKind в конструктор ничего не изменили. - person joshb; 06.01.2012

Посмотрите на конструкторы и код класса DateTime.

Все они изменяют приватную переменную:

private ulong dateData;

Таким образом, все конструкторы одинаковы, а DateTime.Now — общедоступный статический метод, возвращающий экземпляр класса DateTime, который делает то же самое.

В сообщении об ошибке говорилось:

Длительность времени, указанная для FreeBusyViewOptions.TimeWindow, недействительна.

Это потому, что он недействителен!

Вы указали будущую дату, и она, скорее всего, проверила ее. Попробуйте с текущей датой.

person Issa Fram    schedule 05.01.2012
comment
Глядя на метод DateTime.Now, все его возвращаемые значения имеют формат... return new DateTime(value, DateTimeKind.Local... - person Issa Fram; 06.01.2012
comment
Я пробовал текущую дату, и она выдает то же исключение. Весь смысл метода GetUserAvailability заключается в проверке доступности календаря в будущем, поэтому не будет особого смысла, если он не будет принимать окна будущих дат. - person joshb; 06.01.2012