Разлика между обект 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);

Странното е, че ако заменя заданието си за начален час със следното, то работи:

DateTime startTime = DateTime.Now;

Каква е разликата между създадения от мен обект DateTime и обекта, произведен от DateTime.Now. Разгледах ги подробно, докато отстранявах грешки и не мога да намеря разлика.

Някакви идеи?


person joshb    schedule 05.01.2012    source източник
comment
датата час сега ви дава текуща дата и часът, който сте предоставили, е 1/6/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 часа и които започват и завършват в 12: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

Посочете вида, за да бъде идентичен с Now:

     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