c# - CalendarView StartDateTime 总是在 UTC?

标签 c# microsoft-graph-api microsoft-graph-sdks

我正在使用图形客户端 SDK。使用 startDateTime = 2019-11-20T10:00:00.0000000endDateTime = 2019-11-20T23 调用 CalendarView: 00:00.0000000.

在我继续之前,没有一个事件是全天的。许多重复出现,所以这就是为什么我不使用 Events 端点,而是使用 CalendarView 的原因。

我通过设置偏好设置了日历事件的时区,outlook.timezone="东部标准时间" -- 没问题。我可以看到东部标准时间的事件开始和结束时间。

但是,事件不正确。我有一个事件在美国东部时间上午 8:00 开始,另一个事件在美国东部时间下午 6:30 开始。

  • 上午 8:00 的 session 显示了 -- 的时间,因为我的开始标准是上午 10 点。没什么大不了的,但可能是因为它在上午 10 点结束。

  • 下午 6:30 的 session 没有显示,但应该因为我的结束时间是晚上 11:00。这一个问题。

  • 如果我将 6:30 的 session 提前到 6:00,它会显示在集合中。

所以我在想,因为我是 UTC -5startDateTime 被锁定在 UTC 时间。它不按 header 时区。我知道上面提到的 header 时区是有效的,因为如果我设置了 header ,我的事件的实际开始/结束将显示东部时间,如果没有设置则显示 UTC。

我找不到任何允许我强制使用日历 View 的内容?$select=subject,start, end&startDateTime=2019-11-20T10:00:00.0000000&endDateTime=2019-11-20T23:30:00.0000000 使用我的本地时间。

我在 Graph Explorer 中尝试了这个,发现我可以在时间之后放置 -5,它似乎可以工作。我仍然得到 8:00 am 的事件,但我也得到了我的 6:30 事件。我不想在我的代码中这样做,因为那样我会强制其他用户使用我的时区。

有谁知道可以更改什么设置来强制 CalendarView 使用本地时间作为参数?抱歉,我是图形客户端的新手,所以我可能没有使用正确的词汇。

代码:


GraphServiceClient graphClient = new GraphServiceClient(AuthProvider);

DateTime d = DateTime.Now.ToLocalTime();
DateTime.SpecifyKind(d, DateTimeKind.Unspecified).ToString("o");
string MicrosoftDateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffff";
var start = d.ToString(MicrosoftDateTimeFormat);
var end = d.ToString("yyyy'-'MM'-'dd'T'23:59:59.0"); //"2019-07-24T23:00:00.0";//

start = "2019-11-20T10:00:00.0000000"; //for debug only
end = "2019-11-20T23:00:00.0000000"; //for debug only

List<Option> options = new List<Option>
{
    new QueryOption("startDateTime", start),
    new QueryOption("endDateTime", end),
    new QueryOption("orderby", "start/dateTime")
};

var events = await graphClient.Me.CalendarView
    .Request(options)
    .Header("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"")
    .Select(e => new
    {
        e.Subject,
            e.Body,
            e.BodyPreview,
            e.Organizer,
            e.Attendees,
            e.Start,
            e.End,
            e.Location
    })
    .GetAsync();

最佳答案

prefer: outlook.timezone="Eastern Standard Time" header 仅影响 API 响应。您的 header 将确保结果以 EST 返回,但时区转换发生在检索结果之后。在后端,每个事件都存储为 UTC -0

为了请求给定时区范围内的事件,需要使用 ISO 8601 将该时区编码到 startTimeendTime 值中格式:

YYYY-MM-DDThh:mm:ss±hh:mm

或者更简单地说:

{date}T{time}±{offset}

因此,为了将 2019-11-20T10:00:00.0000000startDateTime 转换为复活节标准,它将是 2019-11-20T10:00 :00-5

在 C# 中,DateTimeOffset 对象可以使用 .ToString("O") 为您生成正确的格式:

var tzOffset = new TimeSpan(-5, 0, 0);
var dateTime = new DateTimeOffset(2019, 11, 20, 10, 0, 0, tzOffset);

List<Option> options = new List<Option>
{
    new QueryOption("startDateTime", dateTime.ToString("O")),
    new QueryOption("endDateTime", dateTime.AddHours(24).ToString("O"))
};

您还可以使用 TimeZoneInfo 类查找给定时区的正确 UTC 偏移量。这通常是个好主意,因为时区的变化比您想象的要频繁得多:

TimeSpan tzOffset = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time").BaseUtcOffset;
DateTimeOffset dateTime = new DateTimeOffset(2019, 11, 20, 10, 0, 0, tzOffset);

List<Option> options = new List<Option>
{
    new QueryOption("startDateTime", dateTime.ToString("O")),
    new QueryOption("endDateTime", dateTime.AddHours(24).ToString("O"))
};

关于c# - CalendarView StartDateTime 总是在 UTC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966968/

相关文章:

c# - Visual Studio Visual Studio MVC asp.NET 谷歌地图

c# - 使用在 Threadpool 线程上创建的 BitmapImage

c# - 取消读取文件信息的 OneDrive 任​​务时周期性超时异常

Azure Graph API - 批准 PIM 请求

azure - 通过 Microsoft Graph 添加或删除应用的 API 权限 (requiredResourceAccess)

asp.net-core - 当 Web 应用程序对 Microsoft Graph 的访问者及其自身进行身份验证时的身份验证流程

c# - 如何在 Asp 按钮单击时以编程方式单击 html 按钮?

c# - WebView ContentChanged 事件

php - "Access denied"Microsoft Graph 制作文件夹时

c# - Microsoft Graph 订阅扩展错误 - 删除/更新