2012-01-05 15 views
6

Estoy tratando de usar la API de Exchange 2007 para consultar la disponibilidad del calendario para un usuario específico. Mi código de ejemplo está produciendo la siguiente excepción:Diferencia entre un objeto DateTime que creo y DateTime.Now

La duración de tiempo especificado para FreeBusyViewOptions.TimeWindow es válido.

Aquí está el código de ejemplo:

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); 

Lo extraño es, si reemplazo mi asignación horaInicio con la siguiente funciona:

DateTime startTime = DateTime.Now; 

Cuál es la diferencia entre el objeto DateTime I creado y el objeto producido por DateTime.Now. Los he examinado en detalle durante la depuración y no puedo encontrar la diferencia.

¿Alguna idea?

+0

fecha y hora actual, y la fecha que proporcionó es 1/6/2012 7:00:00 am –

+0

Me doy cuenta de que la fecha/hora real es diferente, pero incluso si configuro la fecha/hora de mi objeto igual Ahora tiene el mismo problema. – joshb

Respuesta

21

Esto realmente parece ser un problema en el método GetUserAvailability en comparación con cualquier manipulación DateTime.

Según la MSDN documentation:

El GetUserAvailability (no específico, TimeWindow, AvailabilityData, AvailabilityOptions) método admite únicamente los períodos de tiempo que son un mínimo de 24 horas de duración y que comienzan y terminan a las 12:00 a.m . Para restringir los resultados del método a un período de tiempo más corto, debe filtrar los resultados en el cliente.

+0

Gracias. Miré la documentación varias veces y la extrañé por completo. Lo raro es que eso no es siempre es cierto (a veces funciona con inicios que no son de 12 am y duraciones de <24 horas) de acuerdo con mis pruebas, pero si permanezco dentro de esos parámetros, siempre parece funcionar. – joshb

+1

tuve la misma experiencia de "oh mierda." Gracias por la ayuda –

+0

Tuve la misma excepción. El problema fue que mi consulta, que también contiene una fecha de inicio y finalización "DefineAvailabilityOptions (query)", no coincidía con la provi ded fecha de inicio y finalización en GetUserAvailability. Entonces, antes de volverse loco con el límite de 24 horas, es posible que desee comprobar esto primero al menos. –

2

Quizás tiene algo que ver con la diferencia entre su zona horaria y UTC, produciendo una ventana de tiempo negativa. Intente aumentar de AddHours (8) a valores más grandes hasta AddHours (24) y vea qué sucede.

+0

Tu sugerencia eliminó la excepción (gracias) pero no estoy muy seguro de por qué. De cualquier manera, agregaré horas al mismo DateTime, así que ¿cómo podría terminar con una ventana de tiempo negativa ya sea local o UTC? – joshb

1

El Kind es diferente. Esto puede ser lo que está buscando.

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

tiene un tipo de "No especificado".

Mientras

DateTime.Now 

tiene una especie de "local".

Intente utilizar ToLocalTime para establecer el tipo de locales:

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

Me di cuenta de eso también cuando estaba depurando, pero usar el método ToLocalTime o pasar el DateTimeKind al constructor no cambió nada. – joshb

2

especificar el tipo para que sea idéntica a Ahora:

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

Con algunas probabilidades de que en realidad se necesita UTC. Depende de la configuración del servidor, probablemente.

+0

Pasar el DateTimeKind todavía produce el error. – joshb

0

Mire los constructores y el código para la clase DateTime.

Todos ellos alteran la variable privada:

private ulong dateData; 

Así que todos los constructores son los mismos y DateTime.Now es un método estático público que devuelve una instancia de la clase DateTime que hace lo mismo.

El mensaje de error indica:

La duración de tiempo especificado para FreeBusyViewOptions.TimeWindow no es válido.

Eso se debe a que no es válido!

Pone una fecha futura, y es muy probable que lo haya comprobado.Pruebe con una fecha actual.

+0

mirando el método DateTime.Now, todas sus devoluciones tienen el formato ... return new DateTime (value, DateTimeKind.Local ... –

+0

He intentado con la fecha actual y produce la misma excepción. del método GetUserAvailability es verificar la disponibilidad futura del calendario, por lo que no tendría mucho sentido si no aceptara windows de fecha futura. – joshb

2

Descubro que el TimeWindow especificado debe contener al menos una medianoche. Pero no sé por qué.

Cuestiones relacionadas