簡體   English   中英

如何在未來為 ICS 文件日歷下載補償夏令時

[英]How to compensate for daylight savings time in the future for ICS file calendar downloads

我有一份各種項目的截止日期清單。 每 3 個月一次,我將接下來 3 個月的截止日期下載為 ICS 文件並將它們添加到我的日歷中。 因為我每 3 個月只下載一次,所以我遇到了關於夏令時 (DST) 的問題。 這是問題的一個例子:

  • 在 1 月份,我下載了即將到來的 2 月、3 月和 4 月的截止日期,將時間設置為各自日期的上午 9:00。
  • 3 月 13 日(夏令時開始),截止日期開始顯示為上午 8:00,因為當我下載它們時,它不是 DST,所以當我們“向前沖”時,過去是上午 9:00 現在是 8 :00 AM,文件沒有對此進行補償。

我無法確定解決此問題的最佳方法是:

  • 在 ICS 文件本身的配置中。 我想如果有一個地方可以做到這一點,它會在這里。 我已經搜索了 ICS 文件的文檔,但還沒有找到將來可以自動補償 DST 的東西。
  • 在前端的 JavaScript 中。 我知道 JavaScript 可以選擇將時區設置為區域(“America/New_York”)而不是時區,這有助於它自動補償 DST,但我無法讓該功能在一個未來的日期,因為它只引用當前時間。
  • 在后端的 PostgreSQL 中。 我嘗試了各種版本的AT TIME ZONE均無濟於事。 我在 JavaScript 中遇到了同樣的問題:它將時間設置在指定的時區,而不考慮日期是否會受到未來 DST 的影響。

更新以發布以包含更多信息

截止日期信息( PROJECT_NAMEDUE_DATE )是從 PostgreSQL 數據庫中提取的。 到期日期存儲為 DATE 值,如下所示: 05-MAR-22

為了增加時間,我采取了兩種方法:

  1. 像這樣在 PostgreSQL 中添加時間:
select ('06-JUN-2022'::date + time '9:00') at time zone 'America/New_York'
  1. 像這樣在 JavaScript 中添加時間:
deadline.DUE_DATE = deadline.DUE_DATE.split("T"[0] += " 09:00:00";

但是這兩種方法都沒有幫助我解決時區問題。

JavaScript 微服務設置以下字段:

BEGIN:VEVENT
UID:[ UID ]
SUMMARY:[ PROJECT_NAME ]
DTSTAMP:[ DTSTAMP ]
DTSTART:[ DTSTART ]
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER:[ TRIGGER ]
END:VALARM
DURATION:PT
END:VEVENT

這似乎缺少配置時區的一些重要細節。

您可以選擇利用 ICS 文件的TZID 參數VTIMEZONE 組件在 ICS 文件中嵌入時區信息。 VTIMEZONE 組件需要將有關 DST 規則的信息添加到文件中,並且每個唯一的 TZID 必須有一個對應的 VTIMEZONE 組件。 您可以使用為每個時區生成VTIMEZONE定義的 tzurl.org。 有關如何執行此操作的更多信息,您可以參考以下相關問題:

我對 Microsoft Outlook 和 Apple 日歷的具體實現細節缺乏一些了解,但我很確定他們會考慮 ICS 文件中的此類相關信息。

查看您如何使用 Javascript 生成 ICS 文件。 聽起來時區設置為夏令時前的時區,這會在夏令時轉換后查看事件時出現問題。 根據ics 規范

無論 iCalendar 對象中是否存在“VTIMEZONE”日歷組件,在沒有“TZID”屬性參數的 DATE-TIME 或 TIME 值中使用本地時間將被解釋為浮動時間。

這也可能指向時區設置錯誤的可能性,因為如果沒有定義“TZID”/“VTIMEZONE”組件,則事件應該被視為“浮動”,或者“相同的小時、分鍾和秒值,無論當前正在觀察哪個時區。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM