Skip to main content

Obsidian fullcalendar 時區 bug

Obsidian fullcalendar 裡面有一些時區的小 bug,但原作不知道什麼時候才會修正,加上打包起來有點麻煩,所以索性就直接讀一下包好的檔案了。

問題

在匯入 ICS calendar 的時候,會有時區的問題。例如世界上不同團隊 setup 的 meeting 可能沒辦法妥善的呈現在 Obsidian 上,因為在讀取時時差亂掉了。

沒有仔細看 Code,但簡略上來說就是會先用 iCal parser 把 ICS 日曆讀取進來,然後再用 luxon 處理時間及時區,最終再用 Full Calendar 呈現。

首先是 parser 的問題,開始時間為 Asia/Taipei:20230804T220000 的活動會被分成,20230804T220000 + Asia/Taipei 兩個部份。

  • getTime3(t3) 中,
  • t3.toUnixTime() 是一個 UTC 的時間(這部份已經不對了,因為實際上20230804T220000 應該是 UTC+8 的時間)
  • 所以在原本的 code 中,所有活動都被顯示成早 8 小時
function getTime3(t3) {
if (t3.isDate) {
return "00:00";
}
return DateTime2.fromSeconds(t3.toUnixTime(), { zone: "UTC" }).toISOTime({
includeOffset: false,
includePrefix: false,
suppressMilliseconds: true,
suppressSeconds: true
});
}

最懶人的方法就是針對不同時區對這個 Object 加一個 Offset 就搞定了。

function getDate2(t3) {
let timezone = (t3.timezone === "Z" || !t3.timezone) ? "UTC" : t3.timezone;
let offset = DateTime2.now().setZone(timezone).offset;
return DateTime2.fromSeconds(t3.toUnixTime(), { zone: "UTC" }).minus({minutes:offset}).toLocal().toISODate();
}

function getTime3(t3) {
if (t3.isDate) {
return "00:00";
}

let timezone = (t3.timezone === "Z" || !t3.timezone) ? "UTC" : t3.timezone;
let offset = DateTime2.now().setZone(timezone).offset;
return DateTime2.fromSeconds(t3.toUnixTime(), { zone: "UTC" }).minus({minutes:offset}).toLocal().toISOTime({
includeOffset: false,
includePrefix: false,
suppressMilliseconds: true,
suppressSeconds: true
});
}