1 回答

TA貢獻(xiàn)1886條經(jīng)驗 獲得超2個贊
您應(yīng)該始終存儲與事件相關(guān)的時區(qū)。由于您說“所有活動都將在公司地址舉行”,因此公司的時區(qū)是相關(guān)的。
如果這些是面對面的實際事件,則用戶當(dāng)前的本地時區(qū)根本不相關(guān)。例如,我希望如果我在洛杉磯預(yù)約牙醫(yī),即使我是從紐約預(yù)約的,我也會指定洛杉磯的時間。
但是,如果事件是虛擬在線事件,那么您可能還想在 UX 中添加一些邏輯以顯示目標(biāo)時區(qū)的時間和等效的本地時間。例如,如果我下周要與一個在洛杉磯的人進(jìn)行視頻通話,而我今天恰好在紐約,那么你不知道通話時我是否還在紐約,或者是否到那時我已經(jīng)去洛杉磯旅行了。您應(yīng)該允許我選擇我在哪個時區(qū)創(chuàng)建約會,并顯示那里的時間和我的等效本地時間。
時區(qū)本身應(yīng)存儲為varchar(14)
. IANA 2017c 為區(qū)域或鏈接標(biāo)識符的各個部分建立了 14 個字符的限制,刪除了唯一超過它的鏈接名稱,Canada/East-Saskatchewan
. (如果您有包含該內(nèi)容的舊數(shù)據(jù),請將其替換為America/Regina
。)
對于單個約會,您應(yīng)該在約會的時區(qū)中存儲約會的日期和時間。您應(yīng)該將其存儲在一種數(shù)據(jù)類型中,該數(shù)據(jù)類型包含沒有任何時區(qū)或偏移量的日期和時間。 timestamp without time zone
在 postgres、datetime2
MS Sql Server 等中。
您可能認(rèn)為您應(yīng)該使用 a timestamp with timezone
(或datetimeoffset
在 SQL Server 中鍵入),但這會將約會固定到等效的通用時間,使用安排約會時適用的規(guī)則。如果這些規(guī)則在任命生效之前發(fā)生變化,那么任命將轉(zhuǎn)移到不同的當(dāng)?shù)貢r間。這通常是不希望的。重點是捕捉用戶的意圖。換句話說,如果我說“12 月 1 日早上 8 點”,那么我的意思是不管我的政府從現(xiàn)在到我的約會時間對我的時區(qū)做了什么。
您也可以將等效的 UTC 時間存儲在一個單獨的字段中,但是您需要在服務(wù)器的時區(qū)數(shù)據(jù)更新時重新計算它。(這樣的字段可以方便快速查詢即將發(fā)生的事件。)
對于定期約會,以上所有內(nèi)容仍然適用,只是您需要存儲某種形式的重復(fù)規(guī)則。有些人喜歡為規(guī)則的各個組成部分存儲許多字段(例如一個字段用于“每天”,一個字段用于“星期三”,一個字段用于一天中的時間,等等)。如果愿意,您可以在數(shù)據(jù)庫中使用date
and類型。time
其他人喜歡存儲帶有 chron 表達(dá)式的字符串。這真的取決于你的需要。
考慮到每次出現(xiàn)的 UTC 等效值不一定相同,對于定期約會尤為重要??紤]到許多時區(qū)根據(jù)夏令時是否有效來交替其 UTC 偏移量。例如,如果我在洛杉磯創(chuàng)建一個每天上午 10 點的約會,那么太平洋標(biāo)準(zhǔn)時間為世界標(biāo)準(zhǔn)時間下午 6 點,太平洋夏令時間為世界標(biāo)準(zhǔn)時間下午 5 點。因此,您不能只存儲 UTC 時間。同樣,捕捉用戶的意圖是最重要的部分。
添加回答
舉報