为.ics文件指定DateTime对象中的时区-时间减少了一个小时(C#,Sitecore 9)

问题描述 投票:1回答:1

我在Sitecore中有事件,每个事件都有一个开始日期,结束日期和一个时区,以及一个链接,该链接生成一个.ics文件以将这些事件添加到您的日历(例如Outlook)。最初,时间不多了,因为(我认为)Sitecore中存储的时间是UTC,因此尽管它在页面上显示为12:00-3:00,但由于该时间是UTC,所以日历事件会将其显示为大约是5:00-8:00。

这是原始代码:

StringBuilder sb = new StringBuilder();
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:-//IFT.org//NONSGML Events//EN");
sb.AppendLine("BEGIN:VEVENT");
sb.AppendFormat("DTSTART;VALUE DATE-TIME:{0}\n", eventDates.Start_Date.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));
sb.AppendFormat("DTEND;VALUE DATE-TIME:{0}\n", eventDates.End_Date.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

我添加了以下代码以考虑指定的时区:

var timezone = eventDates.Time_Zone?._Name;
sb.AppendFormat("DTSTART;VALUE DATE-TIME:{0}\n", GetTime(eventDates.Start_Date, timezone));
sb.AppendFormat("DTEND;VALUE DATE-TIME:{0}\n", GetTime(eventDates.End_Date, timezone));

public String GetTime(DateTime date, String timezone)
{
    var timezoneKey = TimezoneDictionary[timezone];
    var tz = TimeZoneInfo.FindSystemTimeZoneById(timezoneKey);
    TimeSpan offset = new TimeSpan(0, 0, 0);
    if (tz != null)
    {
        offset = tz.BaseUtcOffset;
    }
    DateTimeOffset dto = new DateTimeOffset(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, offset);

    DateTime utcDate = dto.UtcDateTime;
    return utcDate.ToString("yyyyMMddTHHmmssZ");
}

这所有外观都可以正常工作-当我逐步执行时,我发现tz是东部标准时区(我所在的时区),其偏移量为-5:00。 dto似乎是10/21/2019 12:00,偏移为-5:00; utcDate.toString("yyyyMMddTHHmmssZ")给我20191023T170000Z看起来不错(因为12:00 + 5:00 = 17:00)。但是,当我打开.ics文件时,时间显示为1:00和4:00,而不是12:00和3:00(时区为“东部时间”)

我不确定这是我的代码还是Outlook的问题,但这是我的.ics文件:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//IFT.org//NONSGML Events//EN
BEGIN:VEVENT
DTSTART;VALUE DATE-TIME:20191023T170000Z
DTEND;VALUE DATE-TIME:20191026T000000Z
SUMMARY:summary
DESCRIPTION:description
LOCATION:Sun Valley, Idaho
URL;VALUE=URI:http://mysite/events/event-listing/2019/oct/symposium
UID:f10b3138-2737-46d6-b1c0-cbdc18cc0ef6
END:VEVENT
END:VCALENDAR
c# datetime timezone utc timezone-offset
1个回答
2
投票

tz.BaseUtcOffset返回标准时间有效的偏移量-不管标准时间是否实际有效。在您进行活动时,美国东部夏令时间生效,该时间是UTC-4而不是UTC-5。

不要与时区字符串为"Eastern Standard Time"混淆-确实是正确的Id,但它表示both] EST和EDT。您可以将其视为“东部时间”。

为了使偏移有效,您可以将代码更改为:

offset = tz.GetUtcOffset(date)

如果您想简化代码,也可以只使用TimeZoneInfo.ConvertTimeToUtc而不是自己弄清楚偏移量。

© www.soinside.com 2019 - 2024. All rights reserved.