【问题标题】:Difference between a DateTime object I create and DateTime.Now我创建的 DateTime 对象与 DateTime.Now 之间的区别
【发布时间】:2012-02-03 18:36:27
【问题描述】:

我正在尝试使用 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 生成的对象有什么区别。我在调试时对它们进行了详细检查,找不到任何区别。

有什么想法吗?

【问题讨论】:

  • 日期时间现在给你一个当前的日期时间,你提供的日期时间是 1/6/2012 7:00:00 am
  • 我意识到实际的日期/时间是不同的,但即使我将对象的日期/时间设置为 Now 它也有同样的问题。

标签: c# exchangewebservices exchange-server-2007


【解决方案1】:

也许它与您的时区和 UTC 之间的差异有关,从而产生负时间窗口。尝试从 AddHours(8) 增加到更大的值直到 AddHours(24),看看会发生什么。

【讨论】:

  • 您的建议消除了异常(谢谢),但我不确定为什么。无论哪种方式,我都在同一个 DateTime 中增加了几个小时,那么无论是本地时间还是 UTC,我怎么会得到一个负时间窗口?
【解决方案2】:

Kind 不同。这可能就是它正在寻找的东西。

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

有一种“未指定”。

虽然

DateTime.Now

有一种“本地”。

尝试使用ToLocalTime 将种类设置为本地:

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

【讨论】:

  • 我在调试时也注意到了这一点,但使用 ToLocalTime 方法或将 DateTimeKind 传递给构造函数并没有改变任何东西。
【解决方案3】:

指定 Kind 使其与 Now 相同:

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

您可能确实需要 Utc。可能取决于服务器配置。

【讨论】:

    【解决方案4】:

    查看 DateTime 类的构造函数和代码。

    它们都改变了私有变量:

    private ulong dateData;
    

    所以所有的构造函数都是相同的,并且 DateTime.Now 是一个公共静态方法,它返回执行相同操作的 DateTime 类的实例。

    错误信息说明:

    为 FreeBusyViewOptions.TimeWindow 指定的持续时间无效。

    那是因为它无效!

    你输入了一个未来的日期,它很可能已经检查过了。尝试使用当前日期。

    【讨论】:

    • 查看 DateTime.Now 方法,它的所有返回都是格式... return new DateTime(value, DateTimeKind.Local...
    • 我已经尝试了当前日期,它产生了同样的异常。 GetUserAvailability 方法的全部意义在于检查未来日历的可用性,因此如果它不接受未来的日期窗口就没有多大意义。
    【解决方案5】:

    这实际上似乎是 GetUserAvailability 方法中的一个问题,而不是任何 DateTime 操作。

    根据MSDN documentation

    GetUserAvailability(Generic ,TimeWindow,AvailabilityData,AvailabilityOptions) 方法仅支持至少 24 小时且开始和结束于凌晨 12:00 的时间段。要将方法的结果限制在更短的时间段内,您必须在客户端过滤结果。

    【讨论】:

    • 谢谢。我多次查看文档并完全错过了这一点。奇怪的是,根据我的测试,这并不总是正确的(有时它适用于非上午 12 点开始和
    • 我也有同样的异常。问题是我的查询也包含开始和结束日期“DefineAvailabilityOptions(query)”,与 GetUserAvailability 中提供的开始和结束日期不匹配。因此,在 24 小时限制发疯之前,您可能至少要先检查一下。
    【解决方案6】:

    我发现指定的 TimeWindow 必须包含至少一个午夜。但我不知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      相关资源
      最近更新 更多