顯示廣告
隱藏 ✕
※ 本文為 terievv 轉寄自 ptt.cc 更新時間: 2019-04-20 05:33:28
看板 Ajax
作者 eight0 (人類)
標題 Re: [問題] 請問new Date有辦法指定時區嗎?
時間 Mon Dec 17 02:36:15 2018


timestamp 的值,是從 1970-01-01 00:00:00 (UTC) 開始計算,
每過 1ms 就增加 1。也可以說是從 1970-01-01 開始,到取得該
timestamp 的時間點為止,所經過的時間「量」。


它和時區、locale time 是沒有關係的。舉例來說,一台電腦放在台灣,
一台放在英國,同時對兩台電腦下達取得 timestamp 的命令,
所得到的值是相同的。

跟時區、locale time 有關的是「日期」。例如一個台灣人和一個英國人約好
12/17 早上八點通電話,若不確認時區,台灣人到早上八點打電話時,
英國人還在半夜睡覺。

反過來說,同一個 timestamp,用不同的時區換算成日期,所得到的結果也不同。


至於 JavaScript 中的 Date,它只是一個記錄了 timestamp 的物件,
並沒有儲存時區資訊。雖然它有提供把 timestamp 轉成日期的方法,
但都是採用系統時區或 UTC。



你的問題其實有兩部份︰

第一個問題是︰如何將一個「日期」轉換成一個 Date (timestamp),
並且指定轉換時採用的時區?

※ 引述《taco2548 (T@cO)》之銘言:
: 想請問new Date()的時候有辦法同時指定時區嗎?

如果不打算支援IE8的話,使用日期字串即可︰

  // 台灣的早上八點
  new Date("2018-12-17T08:00:00+0800")

  // 英國的早上八點
  new Date("2018-12-17T08:00:00+0000")

格式可以參考︰
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

注意這兩個值(timestamp 的值)是不同的,因為它們分別代表不同的「時間點」。


第二個問題是︰如何將 timestamp 轉換成日期,取得 weekday,
並且指定轉換時採用的時區?

: 確定是否為台灣時間星期日

Date 有提供把 timestamp 換算成 locale weekday 的方法︰

  new Date(timestamp).getDay()

但這個方法換算時所採用的時區來自系統,不能指定。

要指定時區就只能手動換算了︰

  new Date(timestamp + 8*60*60*1000).getUTCDay()

+8*60*60*1000 的意思是,在該 timestamp 的時間點,英國 (UTC) 還要再等
八個小時,他們的「日期」才會和台灣在該時間點的「日期」 相同。


Reference:

* MDN - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Date - JavaScript | MDN
[圖]
Creates a JavaScript Date instance that represents a single moment in time. Date objects use a Unix Time Stamp, an integer value that is the number of ...

 
  縮︰https://is.gd/HaOfhJ
Date - JavaScript | MDN
[圖]
Creates a JavaScript Date instance that represents a single moment in time. Date objects use a Unix Time Stamp, an integer value that is the number of ...

 

--
ヾ(;ω;) ヾ(;ω;)

http://i.imgur.com/oAd97.png

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.186.4
※ 文章代碼(AID): #1S5fifod (Ajax)
※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1544985385.A.CA7.html
cutekid: 大推呀(Y), 總是可以從 eight0 大回覆的文章裡學到東西!1F 12/17 10:39
JustinHere: 用個datatime library之類的,別自己算這類東西。2F 12/19 19:48
JustinHere: 除非不在意誤差,不然日期時間處理是很複雜的。
wotupset: 專業!4F 12/20 11:35

--
※ 看板: terievv 文章推薦值: 0 目前人氣: 0 累積人氣: 784 
作者 eight0 的最新發文:
  • +4 Re: [問題] 請問new Date有辦法指定時區嗎? - Ajax 板
    作者: 36.225.186.4 (台灣) 2018-12-17 02:36:15
    timestamp 的值,是從 1970-01-01 00:00:00 (UTC) 開始計算, 每過 1ms 就增加 1。也可以說是從 1970-01-01 開始,到取得該 timestamp 的時間 …
    4F 4推
  • +10 Re: [問題] 關於setTimeout寫法 - Ajax 板
    作者: 111.250.158.95 (台灣) 2018-09-16 00:42:34
    setTimeout 接受兩種參數︰ var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]); var tim …
    11F 10推
  • +3 Re: [ js ] chrome 的 Math.random() 好固定的感覺 - Ajax 板
    作者: 36.225.58.78 (台灣) 2017-06-26 20:41:44
    這是演算法問題,和 JS 無關。這個做法是完全錯誤的,即使改成了 1 : -1 也一樣。 你給的比較方法為「比較兩元素,有 50% 機率左邊比較大,50% 機率右邊比較大」 就來試試,用在簡單的排序法 …
    4F 3推
  • +3 Re: [問題] 同步變數接異步函數返回值 callback/promise - Ajax 板
    作者: 118.166.131.180 (台灣) 2017-03-12 21:19:44
    Promise 無法解決你的問題,就如一樓所說,你必須把賦值的動作移到 callback 函數內。Promise 是一種用來解決多層 callback 的工具。 先瞭解 JavaScript 的 ca …
    15F 3推
  • +44 [ANSI] Fate/Grand Order - 間桐櫻 - C_Chat 板
    作者: 118.169.188.47 (台灣) 2017-03-02 22:08:44
    ▃▃▂▃▄▅▅▃▂ ▂▂▅▅︻︻▂ ◥ ▅▅▂ ◤ ◤◤ ▇▇ ︻︻◥▁▃▆ ▂▄▆▆▃▃ ▂▂▆▆ ▇▄▄▃︻︻ ▆▃▃ ◣ ▆▆▂▂ ▅▅ ◢◢ ◤◤ ◣ ▆▆ ▇▇ ︼︼ ◣ ▎◢ ] ▋ ▏▃ …
    49F 44推
點此顯示更多發文記錄
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇