我正在努力在兩個日期(活動的開始日期和結束日期)之間在網站上顯示橫幅。
為此,我有以下功能:
function checkCampaignActive() {
const campaignDateStart = new Date('2022-09-14');
const campaignDateStop = new Date('2022-09-15');
const today = Date.now();
const isCampaignStarted = today >= campaignDateStart.getTime();
const isCampaignExpired = today > campaignDateStop.getTime();
this.isCampaignActive = isCampaignStarted && !isCampaignExpired;
console.log('Is started: ', isCampaignStarted);
console.log('Is expired: ', isCampaignExpired);
console.log(isCampaignActive);
}
checkCampaignActive();
問題
由于getTime()回傳 1970 年 1 月 1 日 00:00 GMT 和 2022-09-14 和 00:00 GMT 之間的毫秒數,并且我的當地時間不是 GMT,因此所需的廣告系列開始時間與真實時間之間存在差距。
無論new Date('2022-09-14')回傳什么都必須針對本地時間進行調整,但仍然是一個物件,而不是一個字串。
解決此問題的最簡單方法是什么?
uj5u.com熱心網友回復:
“問題”的原因是您的代碼提供給Date建構式的日期字串被解釋為簡化的 ISO 8601 格式,表示 UTC。
最好的方法是避免使用字串型別的引數,并提供數字引數。相當于你的例子是:
const campaignDateStart = new Date(2022, 8, 14);
const campaignDateStop = new Date(2022, 8, 15);
(注意從零開始的月份編號)
使用字串可以擺脫它。例如,這些選項之所以有效,是因為它們遠離了 JavaScript 將解釋為 UTC 的格式:
附加時間規范(不附加“Z”或其他時區說明符);
const campaignDateStart = new Date('2022-09-14 00:00');
const campaignDateStop = new Date('2022-09-15 00:00');
正如Mozilla 貢獻者所說:
僅日期字串(例如“1970-01-01”)被視為 UTC,而日期時間字串(例如“1970-01-01T12:00”)被視為本地。
或者使用不同的分隔符:
const campaignDateStart = new Date('2022/09/14');
const campaignDateStop = new Date('2022/09/15');
但這些依賴于如何將字串決議為日期的復雜規則。其中一些邏輯是依賴于主機的,因此通常最好避免將字串傳遞給日期建構式(或者Date.parse對字串引數使用相同的邏輯)。
uj5u.com熱心網友回復:
對你的代碼做一個小的改動,就會讓它按照你希望的方式作業。
當您呼叫 new Date('2022-09-14') 時,它會回傳從 1970-01-01 00:00:00 UTC 到 2022-09-14 00:00:00 UTC 的毫秒數,但是您實際上要從 1970-01-01 00:00:00 UTC 2022-09-14 00:00:00 [local timezone]獲取毫秒數。
進行此更改很容易,只需決議 '2022-09-14 00:00:00' 即可,后續日期也一樣。這將回傳預期值并給出正確答案。
function checkCampaignActive() {
const campaignDateStart = new Date('2022-09-14 00:00');
const campaignDateStop = new Date('2022-09-15 00:00');
const today = Date.now();
const isCampaignStarted = today >= campaignDateStart.getTime();
const isCampaignExpired = today > campaignDateStop.getTime();
this.isCampaignActive = isCampaignStarted && !isCampaignExpired;
console.log('Is started: ', isCampaignStarted);
console.log('Is expired: ', isCampaignExpired);
console.log(isCampaignActive);
}
checkCampaignActive();
.as-console-wrapper { max-height: 100% !important; }
uj5u.com熱心網友回復:
訪問此鏈接:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
在 Date 中添加 GMT 以添加您的時區。然后使用 .getTimezoneOffset 以分鐘為單位獲取間隙。
function checkCampaignActive() {
const campaignDateStart = new Date('2022-09-14 GMT 5:45');
const campaignDateStop = new Date('2022-09-15 GMT 5:45');
const today = Date.now();
const today1 = Date.now() campaignDateStart.getTimezoneOffset() * 60;
const isCampaignStarted = today >= campaignDateStart.getTime();
const isCampaignExpired = today > campaignDateStop.getTime();
this.isCampaignActive = isCampaignStarted && !isCampaignExpired;
console.log('Is started: ', isCampaignStarted);
console.log('Is expired: ', isCampaignExpired);
console.log(isCampaignActive);
console.log(today);
console.log(today1);
console.log(campaignDateStart.getTimezoneOffset());
}
checkCampaignActive();
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507648.html
標籤:javascript 约会时间
上一篇:立即捕捉到頁面頂部?
下一篇:有條件地在html中渲染prop
