如果时钟只有一位数,如何在前面添加“0”?

37

我有一些时钟脚本。一切正常,它完美地工作,但是......我有一个问题。如果时钟设置为一个数字小时或分钟,例如1:5,时钟不会在前面加上"0"数字。这是我所做的,但它不起作用。你能帮我吗?非常感谢!

window.setInterval(function update_clock() {
    var currentTime = new Date();
    var currentHours = currentTime.getHours();
    var currentMinutes = currentTime.getMinutes();
    $.ajax({
        success: function (clock) {
            document.getElementById("hour").firstChild.nodeValue = currentHours;
            document.getElementById("minutes").firstChild.nodeValue = currentMinutes;
            if (currentMinutes.length == 1) {
                currentMinutes = "0" + currentMinutes;
            }
        }
    });
}, 999);

2
可能是Javascript中的String.Format?的重复问题。 - Richard Ev
这段代码的“问题”在于 number.length(例如 (42).length)始终为 undefined - user166390
1
这些主题的名称与我的问题毫无关系... - Lukas
9个回答

58

您可以使用.slice来提取字符串的一部分。向它传递一个负数,以从字符串末尾进行切片。

因此,以下操作是可行且非常简单的:

('0'+currentMinutes).slice(-2)
< p>使用'0'拼接可以确保操作的目标始终为字符串。 ('0'+currentMinutes)将产生一个2或3个字母的字符串(例如"07"或"017")。从该字符串中切片最后两个字符将给出一个前导零的两位数。

请注意,如果currentMinutes100,则以上方法会产生"00",因此假定您知道要处理的值。

这可以提取出更可重用的内容:

Number.prototype.zeroPad = function() {
   return ('0'+this).slice(-2);
};

这将允许你编写:

currentMinutes.zeroPad();

您还可以将填充长度设置为变量:

Number.prototype.zeroPad = function(length) {
   length = length || 2; // defaults to 2 if no parameter is passed
   return (new Array(length).join('0')+this).slice(length*-1);
};

这可以称为:

currentMinutes.zeroPad(); // e.g. "07" or "17"
currentMinutes.zeroPad(3); // e.g. "007" or "017"
请注意,虽然currentMinutes.zeroPad()可以工作,但7.zeroPad()不行。

2
像这样的天才代码就是我使用S/O的原因。简单、直接,为什么我以前从来没有想到过呢?! - Nathan

28
currentMinutes 是一个数字,因此它没有 length 属性。同时,在将 currentMinutes 设置为 minutes 元素之前,必须检查 length
类似这样:
var currentHours = currentTime.getHours();
var currentMinutes = currentTime.getMinutes();

$.ajax({
    success: function (clock) {
        if (currentMinutes.toString().length == 1) {
            currentMinutes = "0" + currentMinutes;
        }

        document.getElementById("hour").firstChild.nodeValue = currentHours;
        document.getElementById("minutes").firstChild.nodeValue = currentMinutes;
    }
});

1
与其检查字符串长度,直接执行 currentMinutes < 10 可能更容易。 - J.Kirk.

15

尝试使用padStart()方法。根据MDN文档,padStart()方法将使用另一个字符串填充字符串,直到达到所需长度。此处是关于padStart()的 MDN 文档链接。

如果你想要将你的字符串格式化为4位数字,并在可用位数少于4位时添加前导零。可以使用以下方式来使用padStart()方法:

let str = "34"

str = str.padStart(4, "0") // results in "0034"
console.log(str)

日期示例:

var now = new Date(); 
var year= now.getFullYear(); 
var month= (now.getMonth()+1).toString().padStart(2, "0");
var day= now.getDate().toString().padStart(2, "0");
var hour = now.getHours().toString().padStart(2, "0");
var minute = now.getMinutes().toString().padStart(2, "0");

document.getElementById("date").innerHTML =`${day}-${month}-${year}-${hour}:${minute}`;
 
<div id="date"></div>


9

currentMinutes不会有length属性,因为它是一个Number,而不是String

你可以将其强制转换成String

if ((currentMinutes+'').length == 1) {
     currentMinutes = "0" + currentMinutes;
}

但是,由于你有一个数字,所以你应该使你的条件...

if (currentMinutes < 10) {
     currentMinutes = "0" + currentMinutes;
}

如果你非常疯狂,你可以这样做...

var hoursMinutes = ((new Date)+"").match(/\d+:\d+(?=:)/)[0].split(":");

如果(currentMinutes < 10){ - xdazz

2

根据其他答案,我创建了以下代码:

var now = new Date(); 
var dd = now.getDate(); 
var mm = now.getMonth()+1;
var y = now.getFullYear(); 
var h = now.getHours();
var m = now.getMinutes();

function aZero(n) {
  return n.toString().length == 1 ?  n = '0' + n: n;
}

document.getElementById("out").innerHTML =
  aZero(dd) + "-" +
            aZero(mm) + "-" +
            y +  "   -  "   +
            aZero(h)  + ":" +
            aZero(m);
<div id="out">my time :D</div>

下次再见。

1

我建议尝试使用('0' + currentTime.getHours()).slice(-2)

更新了你的问题 -

window.setInterval(function update_clock() {
    var currentTime = new Date();
    var currentHours = ('0' + currentTime.getHours()).slice(-2);
    var currentMinutes = ('0' + currentTime.getMinutes()).slice(-2);
    $.ajax({
        success: function (clock) {
            document.getElementById("hour").firstChild.nodeValue = currentHours;
            document.getElementById("minutes").firstChild.nodeValue = currentMinutes;
            if (currentMinutes.length == 1) {
                currentMinutes = "0" + currentMinutes;
            }
        }
    });
}, 999);

1

OP 需要 JavaScript 的解决方案,而不是 Android。 - AsgarAli

1

您也可以检查sprintf()的JavaScript。

您可以选择像这样简单的东西:

sprintf("%02d:%02d", currentHours, currentMinutes);

使用接受格式的函数可以让您在需要时更好地控制输出。

0

你可以按照长度进行操作。

我的解决方案是

  var mnt = '' + (seconds / 60).toFixed();
  if (mnt.toString().length == 1) mnt = '0' + mnt;
  var sec = '' + (seconds % 60).toFixed();
  if (sec.toString().length == 1) sec = '0' + sec;
  return `${mnt}:${sec}`;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接