两个给定时间戳的剩余时间百分比 Javascript
Percentage of time left with two given timestamps Javascript
我有两次 Date()
次,我正在尝试使用它们之间的差异来设置进度条的宽度,当两者之间没有更多差异时,从 100% 缩小到 0%次,但我得到了非常奇怪的结果。
这就是我目前正在尝试做的事情(它在 React 中被分成几个不同的功能,所以我只包含相关的代码):
首先,我设置了目标日期时间,将 endDate
设置为接下来 24 小时内的整点(例如,正好是晚上 10 点)...
this.endDate = new Date();
if (this.props.data.end_hr === 0) {
this.endDate.setHours(24, 0, 0, 0);
} else {
this.endDate.setHours(this.props.data.end_hr);
}
this.endDate.setMinutes(0);
this.endDate.setSeconds(0);
this.countdown = setInterval(this.timeRemaining, 1000);
然后在每秒触发的 timeRemaining
函数中,我获取当前日期时间并计算它们之间的差异。最后,我正在尝试计算一个百分比以发送到进度条 css 宽度 属性...
let now = new Date().getTime();
let diff = this.endDate - now;
let percent =
Math.round(((diff / this.endDate) * 100000000 * 2) / 100) + '%';
this.countdownProgress.style.width = percent;
diff
100% 正确,但百分比错误。
我已经尝试了各种不同的方法来计算我能想到的百分比,但都没有达到预期的效果,上面的方法是我能得到的最接近的方法。
有人可以告诉我哪里出错了吗?
编辑:@Danziger 的回答以我想要使用的方式实现。这将开始时间设置为晚上 10 点,结束时间设置为午夜。
事实证明它确实可以正常工作,所以我的代码中一定有其他东西导致了这个问题。再次感谢 Danziger 让我看到光明!
const progressBar = document.getElementById('progressBar');
const progressText = document.getElementById('progressText');
const startDate = new Date();
startDate.setHours(22);
startDate.setMinutes(0);
startDate.setSeconds(0);
const endDate = new Date();
endDate.setHours(24,0,0,0);
endDate.setMinutes(0);
endDate.setSeconds(0);
const range = endDate - startDate;
function updateCountdown() {
const diff = Math.max(0, endDate - new Date());
progressBar.style.width = `${ 100 * diff / range }%`;
progressText.innerText = `${ `000${ Math.ceil(diff / 1000) }`.slice(-4) } seconds`
if (diff >= 0) {
requestAnimationFrame(updateCountdown);
}
}
updateCountdown();
body {
font-family: monospace;
}
.progressBar__base {
position: relative;
height: 32px;
border: 3px solid black;
margin: 0 0 8px;
}
.progressBar__progress {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: blue;
}
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBar"></div>
</div>
<div id="progressText"></div>
我认为您的问题是您没有定义的 startTime
用作参考,而是使用 now
.
如果你有 startTime
,你会这样做:
let now = new Date().getTime();
let totalTime = endTime - startTime;
let progress = now - startTime;
let percentage = (progress / totalTime) * 100;
我实际上不确定你自己计算得到的值是多少。
您需要将 diff
除以某个范围,在这种情况下,您最初的时间差(这是它的最大值),而不是 endDate
:
const progressBarDescending = document.getElementById('progressBarDescending');
const progressBarAscending = document.getElementById('progressBarAscending');
const progressTextDescending = document.getElementById('progressTextDescending');
const progressTextAscending = document.getElementById('progressTextAscending');
const startDate = new Date();
const endDate = new Date(startDate.getTime() + 10000); // + 10 seconds
const range = endDate - startDate;
function updateCountdown() {
const diff = Math.max(0, endDate - new Date());
progressBarDescending.style.width = `${ 100 * diff / range }%`;
progressBarAscending.style.width = `${ 100 - 100 * diff / range }%`;
progressTextDescending.innerText = `${ `000${ Math.ceil(diff / 1000) }`.slice(-4) } seconds left`;
progressTextAscending.innerText = `${ `000${ Math.floor((range - diff) / 1000) }`.slice(-4) } seconds elapsed`;
if (diff >= 0) {
requestAnimationFrame(updateCountdown);
}
}
updateCountdown();
body {
font-family: monospace;
}
.progressBar__base {
position: relative;
height: 32px;
border: 3px solid black;
margin: 16px 0 8px;
}
.progressBar__progress {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: blue;
}
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBarDescending"></div>
</div>
<div id="progressTextDescending"></div>
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBarAscending"></div>
</div>
<div id="progressTextAscending"></div>
那么,假设您在 startDate = 5
和 endDate = 15
开始倒计时,那么您的 range = 10
.
如果您想在 5
秒后更新 diff
,那就是 diff = endDate - now = endDate - 10 = 5
。然后,progress = 100 * diff / range = 100 * 5 / 10
,不是 progress = 100 * diff / endDate = 100 * 5 / 15
。
我有两次 Date()
次,我正在尝试使用它们之间的差异来设置进度条的宽度,当两者之间没有更多差异时,从 100% 缩小到 0%次,但我得到了非常奇怪的结果。
这就是我目前正在尝试做的事情(它在 React 中被分成几个不同的功能,所以我只包含相关的代码):
首先,我设置了目标日期时间,将 endDate
设置为接下来 24 小时内的整点(例如,正好是晚上 10 点)...
this.endDate = new Date();
if (this.props.data.end_hr === 0) {
this.endDate.setHours(24, 0, 0, 0);
} else {
this.endDate.setHours(this.props.data.end_hr);
}
this.endDate.setMinutes(0);
this.endDate.setSeconds(0);
this.countdown = setInterval(this.timeRemaining, 1000);
然后在每秒触发的 timeRemaining
函数中,我获取当前日期时间并计算它们之间的差异。最后,我正在尝试计算一个百分比以发送到进度条 css 宽度 属性...
let now = new Date().getTime();
let diff = this.endDate - now;
let percent =
Math.round(((diff / this.endDate) * 100000000 * 2) / 100) + '%';
this.countdownProgress.style.width = percent;
diff
100% 正确,但百分比错误。
我已经尝试了各种不同的方法来计算我能想到的百分比,但都没有达到预期的效果,上面的方法是我能得到的最接近的方法。
有人可以告诉我哪里出错了吗?
编辑:@Danziger 的回答以我想要使用的方式实现。这将开始时间设置为晚上 10 点,结束时间设置为午夜。
事实证明它确实可以正常工作,所以我的代码中一定有其他东西导致了这个问题。再次感谢 Danziger 让我看到光明!
const progressBar = document.getElementById('progressBar');
const progressText = document.getElementById('progressText');
const startDate = new Date();
startDate.setHours(22);
startDate.setMinutes(0);
startDate.setSeconds(0);
const endDate = new Date();
endDate.setHours(24,0,0,0);
endDate.setMinutes(0);
endDate.setSeconds(0);
const range = endDate - startDate;
function updateCountdown() {
const diff = Math.max(0, endDate - new Date());
progressBar.style.width = `${ 100 * diff / range }%`;
progressText.innerText = `${ `000${ Math.ceil(diff / 1000) }`.slice(-4) } seconds`
if (diff >= 0) {
requestAnimationFrame(updateCountdown);
}
}
updateCountdown();
body {
font-family: monospace;
}
.progressBar__base {
position: relative;
height: 32px;
border: 3px solid black;
margin: 0 0 8px;
}
.progressBar__progress {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: blue;
}
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBar"></div>
</div>
<div id="progressText"></div>
我认为您的问题是您没有定义的 startTime
用作参考,而是使用 now
.
如果你有 startTime
,你会这样做:
let now = new Date().getTime();
let totalTime = endTime - startTime;
let progress = now - startTime;
let percentage = (progress / totalTime) * 100;
我实际上不确定你自己计算得到的值是多少。
您需要将 diff
除以某个范围,在这种情况下,您最初的时间差(这是它的最大值),而不是 endDate
:
const progressBarDescending = document.getElementById('progressBarDescending');
const progressBarAscending = document.getElementById('progressBarAscending');
const progressTextDescending = document.getElementById('progressTextDescending');
const progressTextAscending = document.getElementById('progressTextAscending');
const startDate = new Date();
const endDate = new Date(startDate.getTime() + 10000); // + 10 seconds
const range = endDate - startDate;
function updateCountdown() {
const diff = Math.max(0, endDate - new Date());
progressBarDescending.style.width = `${ 100 * diff / range }%`;
progressBarAscending.style.width = `${ 100 - 100 * diff / range }%`;
progressTextDescending.innerText = `${ `000${ Math.ceil(diff / 1000) }`.slice(-4) } seconds left`;
progressTextAscending.innerText = `${ `000${ Math.floor((range - diff) / 1000) }`.slice(-4) } seconds elapsed`;
if (diff >= 0) {
requestAnimationFrame(updateCountdown);
}
}
updateCountdown();
body {
font-family: monospace;
}
.progressBar__base {
position: relative;
height: 32px;
border: 3px solid black;
margin: 16px 0 8px;
}
.progressBar__progress {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: blue;
}
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBarDescending"></div>
</div>
<div id="progressTextDescending"></div>
<div class="progressBar__base">
<div class="progressBar__progress" id="progressBarAscending"></div>
</div>
<div id="progressTextAscending"></div>
那么,假设您在 startDate = 5
和 endDate = 15
开始倒计时,那么您的 range = 10
.
如果您想在 5
秒后更新 diff
,那就是 diff = endDate - now = endDate - 10 = 5
。然后,progress = 100 * diff / range = 100 * 5 / 10
,不是 progress = 100 * diff / endDate = 100 * 5 / 15
。