簡體   English   中英

給定一個日期,無論時區如何,我如何才能以 UTC 格式獲取前一個星期一?

[英]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 似乎總是與用戶當前時區一起工作的事實有關:

  1. 如果給定的時間戳以 UTC/GMT 格式計算為星期一的午夜,則取決於用戶的時區,它將返回一周的星期一(因為startDate計算為星期一之前的星期日),這不好.
  2. 返回的monday是本地時間,而不是 UTC/GMT 時間。

這讓我徹底瘋了。 在 JavaScript 中處理日期是一場噩夢,如果您能給我任何指導,我將不勝感激。

將 unix 時間戳乘以 1000,並使用 UTC 方法,例如getUTCDate代替getDatesetUTCHours代替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,因此您可以:

  1. 從日期中減去 4 UTC 天的毫秒數 (34.56e7) 以與星期一而不是星期四對齊
  2. 獲取該值除以 7 UTC 天的毫秒數的余數(7 * 8.64e7 或 60.48e7)
  3. 從當前日期減去余數,這將返回上一個星期一並同時刪除時間分量

上述算法僅適用於紀元之后的日期。 之前的日期的時間值是負數,所以在得到余數之前加上 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM