[英]Given a date, how can I get the previous Monday in UTC format regardless of time zone?
我得到一個像這樣的unix時間戳: 1655402413
,我需要找到同一周的星期一的午夜(UTC/GMT格式),不管它是哪一天或什么時區。 然后我需要將該星期一表示為一個 unix 時間戳並返回它。 我的功能如下:
function findMonday(unixTimeStamp) {
let startDate = new Date(unixTimeStamp);
let startDay = startDate.getDay();
let diff = startDate.getDate() - startDay + (startDay === 0 ? -6 : 1);
let monday = new Date(startDate.setDate(diff));
monday.setHours(0, 0, 0, 0);
monday = new Date(monday).valueOf();
return monday;
}
該功能幾乎可以工作,但有兩個問題,都與 Date 似乎總是與用戶當前時區一起工作的事實有關:
startDate
計算為星期一之前的星期日),這不好.monday
是本地時間,而不是 UTC/GMT 時間。這讓我徹底瘋了。 在 JavaScript 中處理日期是一場噩夢,如果您能給我任何指導,我將不勝感激。
將 unix 時間戳乘以 1000,並使用 UTC 方法,例如getUTCDate
代替getDate
, setUTCHours
代替setHours
等。
當然要以 unix 時間返回,只需除以 1000。
例如。
function findMonday(unixTimeStamp) { let startDate = new Date(unixTimeStamp * 1000); let startDay = startDate.getUTCDay(); let diff = startDate.getUTCDate() - startDay + (startDay === 0 ? -6 : 1); let monday = new Date(startDate.setUTCDate(diff)); monday.setUTCHours(0, 0, 0, 0); monday = new Date(monday).valueOf(); return monday; } const monday = findMonday(1655402413); const unixMonday = Math.trunc(monday / 1000); console.log('The Date: ' + new Date(monday).toISOString()); console.log('Unix time: ' + unixMonday);
至於基思的回答,但更簡潔一些。 它返回秒,而不是毫秒。 ;-)
// Given UNIX timestamp, return similar timestamp for // previous UTC Monday at 00:00:00 let getLastUTCMonday = ts => { let d = new Date(ts * 1e3); d.setUTCDate(d.getUTCDate() - (d.getUTCDay() || 7) + 1); return d.setUTCHours(0,0,0,0) / 1e3 | 0; }; let ts = 1655402413; let tsPriorMonday = getLastUTCMonday(ts) console.log( `Start date : ${new Date(ts*1e3).toUTCString()}\n` + `Prior Monday: ${new Date(tsPriorMonday * 1e3).toUTCString()}` );
在 ECMA-262 中,與紀元的偏移量(以毫秒為單位)稱為“時間值”。 時間戳是表示時間或日期的任何內容,因此時間值就是時間戳。 ;-)
鑒於 ECMAScript UTC 天數總是正好 8.64e7 毫秒長,您可以通過一些簡單的算術計算出從今天開始的前一個 UTC 星期一。
ECMAScript 時期是 1970 年 1 月 1 日星期四 00:00:00,因此您可以:
上述算法僅適用於紀元之后的日期。 之前的日期的時間值是負數,所以在得到余數之前加上 3 天,然后減去余數 + 7 天(即日期 - 余數 - 7 天)。
以下只是進行后紀元計算:
let getPreviousUTCMonday = date => { let weekRem = (date - 34.56e7) % 60.48e7; return date - weekRem; } let d = new Date(); for (let i=0; i<12; i++) { console.log(`${d.toUTCString()}\n` + `${new Date(getPreviousUTCMonday(d)).toUTCString()}`); d.setDate(d.getDate() + 1); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.