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
});
}