我寫了一個基本的函式,目的是為了記錄每個訪問者點擊頁面的時間,抓取一個時間戳。實際上,我想以兩種方式記錄時間;本地時間(這樣我就可以看到基于用戶時間的訪問分布)以及UTC時間(這樣我就可以從全球的、規范化的角度看到訪問分布)
我寫了一個基本的函式,目的是抓取每個訪問者點擊頁面的時間,用于記錄。
var currentTime = new Date();
var timestamp = splitTimestamp(currentTime)。
function splitTimestamp(timestamp) {
var splitTimestamp = {};
splitTimestamp.local = new Date(timestamp. getFullYear(), timestamp.getMonth(), timestamp. getDate(), timestamp.getHours(), timestamp. getMinutes(), timestamp.getSeconds().toISOString()。
splitTimestamp.UTC = new Date(timestamp. getUTCFullYear(), timestamp.getUTCMonth(), timestamp. getUTCDate(), timestamp.getUTCHours(), timestamp. getUTCMinutes(), timestamp.getUTCSeconds().toISOString()。
return splitTimestamp。
我的想法是,我可以根據需要通過timestamp.local或timestamp.UTC來參考每個人。
我曾認為通過new Date()得出的本地時間將只是瀏覽器中的本地時間,也就是用戶的本地系統/作業系統中的時間。然而,我看到許多記錄似乎與此相矛盾。例如,我發現一條來自紐約(UTC 4)用戶的記錄,其中的時間還沒有發生(即當我看到這條記錄時,是美國東部時間上午11點/UTC下午3點,但在日志中顯示為美國東部時間下午2點/UTC下午6點)
現在--最初,我對這個問題的解釋是,用戶可能只是使用了不一定與他們的物理位置一致的系統設定(即他們在紐約,但由于只有他們自己知道的原因,他們將他們的系統/作業系統保持在UTC時間上),而我對此無能為力,我對此感到很滿意。
但是... 如果是這樣的話,那么本地時間和UTC時間就會相同?而......它們不是。所以......這不可能是正在發生的事情。
我是否忽略了一些明顯的問題?
uj5u.com熱心網友回復:
如果你只是想要一個符合該格式的時間字串,你可以使用new Date(date)復制日期物件(沒有理由放年、月、日期等),然后減去偏移量,得到ISO格式的字串。然后你應該去掉字串末尾的'z',以表明它是當地的時區而不是UTC時區。
var date = new Date();
var utc_time = date.toISOString()。
var offset_date = new Date(date)。
offset_date.setMinutes(date.getMinutes()-date.getTimezoneOffset() )。
var local_time = offset_date.toISOString().slice(0, -1)。
console.log(utc_time)。
console.log(local_time);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
您可能還有興趣看看我的ProtoDate庫。我建立它是為了處理像這樣的事情。
uj5u.com熱心網友回復:
由Date.prototype.toString產生的時間戳擁有你需要的所有資訊。它有本地*的日期和時間以及UTC的偏移量,其格式可以被內置的分析器決議,并且它可以通過一些重新格式化的方式被轉換為符合ISO 8601標準的格式(也可以被內置的分析器決議),例如:
。 。//以ISO 8601格式回傳UTC時間戳。
//@param {string} timestamp - in format per ECMA-262 Date.prototype.toString。
// @returns {string}等效的時間戳,格式為ISO 8601 UTC。
//e.g. Fri Sep 10 2021 08:08:32 GMT 1000 (ChST) -> 2021-09-09T22:41:11.000Z
function toUTC(timestamp){
return new Date(timestamp).toISOString()。
}
//從Date.prototype.toString回傳ECMA-262的時間戳的偏移量。
// @param {string} timestamp - in format per ECMA-262 Date.prototype.toString .
// @return {string} offset,格式與toUTC相同。
//e.g. Fri Sep 10 2021 08:08:32 GMT 1000 (ChST) -> 10:00
function getOffset(timestamp){
let offset = (timestamp.match(/[ -]d{4}/) || [] )[0] 。]
return offset? `${offset.slice(0,3)}: ${offset. slice(-2)}` : '';
}
//將ECMA-262的默認時間戳重設為ISO 8601 UTC,。
//@param {string} timestamp - in format per ECMA-262 Date.prototype.toString
// @return {string}等同于ISO 8601格式的時間戳與本地日期。
//和帶有本地偏移的時間。
//e.g. Fri Sep 10 2021 08:08:32 GMT 1000 (ChST) -> 2021-09-09T08:08:32.000 10:00
function toISOLocal(timestamp){
let months = [,'Jan','Feb', 'Mar','Apr','May','Jun'。
'July','Aug','Sep', 'Oct','Nov','Dec'】。]
let pad = n => ('0' n).slice(-2)。
let [dayName, monthName, day, year, hour, min, sec, g, offset] = timestamp.split(/W/) 。
let sign = / /.test(timestamp)? ' '/span> : '-'/span>;
return `${year}-${pad(month. indexOf(monthName))}-${pad(day)}`
`T${hour}: ${min}: ${sec}. 000${getOffset(timestamp)}`。
}
// Examples.
///以ECMAScript格式,例如:Fri Sep 10 2021 08:08:32 GMT 1000 (ChST)。
let timestamp = new Date().toString() 。
console.log('Input : ' timestamp
'
UTC : ' toUTC(timestamp)
'
本地 : ' toISOLocal(timestamp)
'
Offset: ' getOffset(timestamp)
);
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
唯一的問題是,由toString(±HHmm)回傳的偏移量的格式與由toISOString(±HH:mm)產生的格式不同。getOffset函式回傳后者的格式,如果您需要另一種格式,可以很容易地改變它。
關于內置決議器,閱讀為什么Date.parse會給出不正確的結果?
*其中 "本地 "是指 "本地"。
* 其中 "本地 "是指基于主機系統的設定,它可能與系統的地理位置的值相匹配,也可能不匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312019.html
標籤:
上一篇:格式字串漏洞之任意地址覆寫大數字
