在測試功能時發現,在 IOS 版本低於16的 Iphone 上,執行
// dateTime 為 'YYYY/MM/DD HH:mm:ss'
new Date(dateTime.replaceAll('/', '-')).toISOString();
得到 Invalid Date ,所以造成一些問題;原先以為是 toISOString() 的問題,後來發現其它有用到 new Date() 的地方也有遇到問題,查詢後才確定是 IOS 低版本會遇到的問題。
但這其實不能完全說是 IOS 的錯,而是像 chrome 這些瀏覽器,當你傳比較不合規的格式,它還是有辦法解析。
所以就來順便學習一下 new Date
相關的用法。
MDN也有相關備註: 由於瀏覽器之間的不同與差異,強烈不建議使用解析字串的方式建立 Date 物件。
new Date()
:不帶任何參數,創建一個表示當前日期和時間的 Date 物件。new Date(milliseconds)
:傳入一個表示從 1970-1-1 00:00:00 UTC(協調世界時)到現在的毫秒數。new Date(dateString)
:傳入一個表示日期和時間的字串。字串的格式應該符合 JavaScript 的日期時間格式,例如 "2022-01-01" 或 "2022-01-01T00:00:00Z"。但是,這種方式並不推薦,因為不同的瀏覽器可能會對日期時間字串的解析有不同的行為。new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
:傳入一個表示年份的數字,一個表示月份的數字(從 0 開始,0 表示一月),以及可選的表示日、時、分、秒、毫秒的數字。
不建議用法:
const today = new Date();
const birthday = new Date("1995-12-17 03:24:00");
const birthday = new Date("2022-01-01");
- 跨瀏覽器兼容性:不同的瀏覽器可能會對日期時間字串的解析有不同的行為。例如,一些瀏覽器可能會將 “2022–01–01” 解析為 UTC 時間,而其他瀏覽器可能會將其解析為本地時間。這可能會導致在不同的瀏覽器中得到不同的結果。
- 格式限制:JavaScript 的 Date 解析只支援一些特定的日期時間格式。如果你的字串不符合這些格式,則 Date 物件可能會被建立為 “Invalid Date”。
- 時區問題:當你解析一個日期時間字串時,如果字串中沒有指定時區,則可能會根據瀏覽器的行為將其解析為 UTC 時間或本地時間。這可能會導致你得到的時間與你期望的時間不同。