【发布时间】:2014-12-21 08:47:30
【问题描述】:
我有一个 Outlook VSTO 插件,我正在使用 the GetFreeBusy() API Calll 搜索资源日历可用性,给定一个日期,它将在接下来的 28 天内以 30 分钟的增量(默认情况下)搜索以确定哪些插槽是空闲的哪个很忙。它工作正常,除了我正在努力弄清楚如何应对在 28 天间隔内存在夏令时的情况。
这是我的代码:
using Microsoft.Office.Interop.Outlook;
string freeBusy = exchangeUser.GetFreeBusy(startDate, 30, true);
这给了我一个这样的字符串,它以 30 分钟的增量返回 28 天的空闲/忙碌可用性。
0000000000000000202222222222000000000000000000000000000000000222222
此字符串的长度始终为 1344 个字符(每天 48 个时隙 * 28 天)
其中每个字符代表一个 30 分钟的时段,如果时间空闲,则显示 0。我有以下解析代码that I took from this Microsoft article,它返回一个空闲时隙数组:
private IEnumerable<DateTime> ParseFreeBusy(string freeBusyString, DateTime startingDate)
{
var timeSlots = new List<DateTime>();
for (int i = 0; i < freeBusyString.Length; i++)
{
double slot = i * 30;
DateTime timeSlot = startingDate.Date.AddMinutes(slot);
bool isFree = freeBusy.Substring(i, 1) == "0";
if (isFree)
{
timeSlots.Add(timeSlot);
}
}
return timeSlots;
}
如果我将 10 月 25 日作为开始日期,当我查看结果时,一切都会完美排列,直到 11 月 2 日凌晨 2 点(考虑到夏令时)
根本问题是我的幼稚代码只是递增并为每个条目不断增加 30 分钟,因为我只是循环遍历每个插槽并执行此操作:
startingDate.Date.AddMinutes(slot);
我做了一个测试,并在 11 月 2 日凌晨 1 点至凌晨 2 点预订了一个日历时段,这就是我从那天开始从 GetFreeBusy() 得到的结果
002222000...
所以使用上面的默认循环(记住,每个字符都是一个 30 分钟的槽并且 0 = 空闲),这将转换为以下槽逻辑:
12L00 AM - free (0)
12:30 AM - free (0)
1L00 AM - booked (2)
1:30 AM - booked (2)
THESE NEXT TWO "booked" below is really representing the 2nd 1AM - 2AM since we roll the clocks back an hour
2:00 AM - booked (2)
2:30 AM - booked (2)
3:00 AM - free (0)
这是错误的,因为当“真正的”2-3A AM 空闲时,我的代码会显示 2AM - 3AM 已预订。如果我的解析是正确的并处理了这个回滚,我最终会得到这个正确的答案:
12L00 AM - free (0)
12:30 AM - free (0)
1L00 AM - booked (2)
1:30 AM - booked (2)
IGNORE the second 1AM to 2AM as its already taken care of
2:00 AM - free (0)
2:30 AM - free (0)
3:00 AM - free (0)
有趣的是,无论夏令时如何,生成的字符串始终为 1344 个字符长(我本以为在涉及夏令时的那几个月里它会更短或更长)。
有没有人有使用 Outlook GetFreeBusy() 的经验,并了解当您达到每日节省时间段时如何处理这种情况?
我一直在玩一些想法,例如:
var tzInfo = TimeZoneInfo.Local;
if (tzInfo.IsAmbiguousTime(timeSlot))
{
//this would be a time to do something
}
或类似的东西
DaylightTime daylightTime = tz.GetDaylightChanges(minStartTime.Year);
if (daylightTime.End == proposedTimeSlot)
{
daylightSavingsOffset = daylightSavingsOffset + ((daylightTime.Delta.Hours * 60) / meetingDuration);
}
但我不完全确定一旦我检测到“特殊插槽”后该怎么办,而且我找不到任何关于这种情况的文档或建议。
有什么建议吗?
【问题讨论】:
标签: c# outlook timezone vsto dst