【问题标题】:Countdown Hours Minutes Seconds倒计时时分秒
【发布时间】:2021-09-12 14:23:18
【问题描述】:

我想创建一个倒计时,在迈阿密时间 7 月 13 日凌晨 12 点的 00:00:00 之前每隔几小时、每分钟、每秒钟计数一次。

我想添加该代码 sn-p 并且我在计算时遇到了困难。 我应该如何调整代码 sn-p 以显示小时、分钟、秒而不是天、小时、分钟、秒?

我应该如何将日期写为 7 月 13 日凌晨 12 点 迈阿密时间 00:00:00? 接下来我应该尝试什么?

谢谢。

<p id="demo"></p>

<script>
// Set the date we're counting down to
var countDownDate = new Date("Jan 5, 2022 15:37:25").getTime();

// Update the count down every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

  // Find the distance between now and the count down date
  var distance = countDownDate - now;

  // Time calculations for days, hours, minutes and seconds
  var days = Math.floor(distance / (1000 * 60 * 60 * 24));
  var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((distance % (1000 * 60)) / 1000);

  // Display the result in the element with id="demo"
  document.getElementById("demo").innerHTML = days + "d " + hours + "h "
  + minutes + "m " + seconds + "s ";

  // If the count down is finished, write some text
  if (distance < 0) {
    clearInterval(x);
    document.getElementById("demo").innerHTML = "EXPIRED";
  }
}, 1000);
</script>

-- WayneOS 代码截图修改

// Format output-string
  var outputHours =  (hours < 10 ? '0' + hours : hours);
  var outputMinutes = (minutes < 10 ? '0' + minutes : minutes);
  var outputSeconds = (seconds < 10 ? '0' + seconds : seconds);

  // Display the result in the element with id="demo"
  if (distance > 0)
      document.getElementById("hours").innerHTML = outputHours;
      document.getElementById("minutes").innerHTML = outputMinutes;
      document.getElementById("seconds").innerHTML = outputSeconds;

  else
      document.getElementById("hours").innerHTML = "EXPIRED";

}, 1000);
```

【问题讨论】:

标签: javascript counter


【解决方案1】:

您可以使用循环来计算小时、分钟和秒,直到 distance 小于 1000。要在 7 月 13 日 12:00:00 结束,请使用 new Date("Jul 13, 2021 12:00:00 GMT-4") 这是一个示例。

// Set the date we're counting down to
var countDownDate = new Date("Jul 13, 2021 12:00:00 GMT-4").getTime();

// Update the count down every 1 second
var x = setInterval(function() {

  // Get today's date and time
  var now = new Date().getTime();

  // Find the distance between now and the count down date
  var distance = countDownDate - now;

  // Time calculations for hours, minutes and seconds
  var hours   = 0;
  var minutes = 0;
  var seconds = 0;
  while (true)
    if (distance >= (1000*60*60)) {
    
      hours++;
      distance -= (1000*60*60);
    
    } else
    if (distance >= (1000*60)) {
    
      minutes++;
      distance -= (1000*60);
    
    } else
    if (distance >= 1000) {
    
      seconds++;
      distance -= 1000;
    
    } else
      break;

  // Format output-string
  var hours   = (hours < 10 ? '0' + hours : hours);
      minutes = (minutes < 10 ? '0' + minutes : minutes);
      seconds = (seconds < 10 ? '0' + seconds : seconds);

  // Display the result in the element with id="demo"
  if (distance > 0) {
      document.getElementById("hours").innerHTML = hours;
      document.getElementById("minutes").innerHTML = minutes;
      document.getElementById("seconds").innerHTML = seconds;
  } else
      document.getElementById("hours").innerHTML = "EXPIRED";

}, 1000);
<div id="hours"></div>
<div id="minutes"></div>
<div id="seconds"></div>

【讨论】:

  • 您好,感谢您的解决方案。它完美地工作。一个问题:是否可以始终将计数器显示为 ::* ?我希望从 0 到 9 的秒数显示 01 02 03... 而不是 1 2 3。谢谢!
  • @theovogg 当然有可能。我改变了答案。
  • 非常感谢。问题是,我试图在 ID #hours #minutes #seconds 的 3 个不同 div 中显示小时、分钟和秒。我试图修改您的代码,但我不工作(我将代码粘贴在我的原始帖子中)。谢谢。
  • @theovogg 我再次更新了我的答案。你的代码对我来说看起来不错。也许你通过查看我的解决方案发现了你的错误。
【解决方案2】:

如果您有天数,您可以计算小时数(天数 * 24 加上剩余小时数)。这里对您的代码进行一些重构。它使用setTimeout(更多控制和计数立即开始)和一个单独的函数来计算时间单位。 See also.

关于迈阿密时区,您可以使用时区“America/New_York”创建日期。

const getNextJuly13 = () => {
  const now = new Date();
  const miamiTime = new Date(`${
    +(now.getMonth() > 6 && now.getDate() >= 13) + now.getFullYear()}/07/13 00:00`)
    .toLocaleString('en', {timeZone: 'America/New_York'});
  return new Date( miamiTime );
};

countDown(getNextJuly13(), document.querySelector("#demo"));

function countDown(until, writeTo) {
  const distance = until - new Date();
  const diffs = dateDiffCalc(distance);
  const timeInfo4Demo = `\n\n=> Until ${
    until.toLocaleString()} (your TZ: ${
      Intl.DateTimeFormat().resolvedOptions().timeZone})\n${
        JSON.stringify(diffs, null, 2)}`;
  writeTo.textContent = `${diffs.totalHours}h ${
    diffs.minutes}m ${diffs.seconds}s${timeInfo4Demo}`;
  return distance >= 0 
   ? setTimeout(() => countDown(until, writeTo), 1000)
   : writeTo.textContent = "EXPIRED";
};

function dateDiffCalc(milliseconds) {
  const secs = Math.floor(milliseconds / 1000);
  const mins = Math.floor(secs / 60);
  const hours = Math.floor(mins / 60);
  const days = Math.floor(hours / 24);

  return {
    days,
    hours: hours % 24,
    totalHours: (days * 24) + (hours % 24),
    minutes: mins % 60,
    seconds: secs % 60,
  };
}
&lt;pre id="demo"&gt;&lt;/pre&gt;

【讨论】:

  • 您好,感谢您的重构。我查了一下,有些东西看不懂。结果是第 12 天,第 2 小时,但总小时数为 578。
  • 谢谢@theovogg:忘记了剩余小时数的模数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
相关资源
最近更新 更多