我正在尝试使用Exchange 2007 API查询特定用户的日历可用性。我的示例代码产生以下异常:
为FreeBusyViewOptions.TimeWindow指定的持续时间是 无效。
以下是示例代码:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.AutodiscoverUrl("email@domain.com");
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@domain.com") }, tw, AvailabilityData.FreeBusyAndSuggestions);
奇怪的是,如果我用以下内容替换我的startTime赋值,它可以工作:
DateTime startTime = DateTime.Now;
我创建的DateTime对象与DateTime.Now生成的对象之间有什么区别。我在调试时对它们进行了详细检查,但无法找到差异。
有什么想法吗?
答案 0 :(得分:23)
这实际上似乎是GetUserAvailability方法中的一个问题,而不是任何DateTime操作。
GetUserAvailability(Generic,TimeWindow,AvailabilityData,AvailabilityOptions)方法仅支持最少24小时的开始和结束时间的时间段。要将方法的结果限制为更短的时间段,您必须在客户端上过滤结果。
答案 1 :(得分:2)
可能它与您的时区和UTC之间的差异有关,产生一个负时间窗口。尝试从AddHours(8)增加到更大的值到AddHours(24),看看会发生什么。
答案 2 :(得分:2)
指定种类使其与现在相同:
DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0, DateTimeKind.Local);
有些可能你确实需要Utc。可能取决于服务器配置。
答案 3 :(得分:2)
我发现指定的TimeWindow必须包含至少一个午夜。但我不知道为什么。
答案 4 :(得分:1)
Kind
不同。这可能是它正在寻找的东西。
new DateTime(2012, 1, 6, 7, 0, 0)
有一种“未指定”。
虽然
DateTime.Now
有一种“本地”。
尝试使用ToLocalTime将种类设置为本地:
DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0).ToLocalTime();
答案 5 :(得分:0)
查看DateTime类的构造函数和代码。
所有这些都改变了私有变量:
private ulong dateData;
因此所有构造函数都是相同的,而DateTime.Now是一个公共静态方法,它返回一个DateTime类的实例,它执行相同的操作。
错误消息说明:
为FreeBusyViewOptions.TimeWindow指定的持续时间无效。
那是因为无效!
您输入了将来的日期,并且很可能会检查该日期。尝试使用当前日期。