Javascript在IOS上返回NAN NAN NAN

时间:2020-11-01 20:31:46

标签: javascript

我正在使用此功能根据当前用户时区将UTC时间戳转换为日期

let timeConversion = (new Date().getTimezoneOffset() * -1 / 60) * 60 * 60;

function formatTime(time) {
  let d = new Date(((time + timeConversion) * 1000));
  return (d.getUTCDate() < 10 ? '0' + d.getUTCDate() : d.getUTCDate()) + '/' +
    (d.getUTCMonth() + 1 < 10 ? '0' + (d.getUTCMonth() + 1) : (d.getUTCMonth() + 1)) + '/' +
    d.getUTCFullYear().toString().substr(2, 4) + ' ' +
    (d.getUTCHours() < 10 ? '0' + d.getUTCHours() : d.getUTCHours()) + ':' +
    (d.getUTCMinutes() < 10 ? '0' + d.getUTCMinutes() : d.getUTCMinutes());
}

let allDates = document.getElementsByClassName("candidatedate");
Array.prototype.forEach.call(allDates, function(el) {
  el.innerHTML = formatTime(parseInt(el.innerHTML));
  el.className = "candidatedate";
});
<span class="candidatedate">1604263179</span><span class="candidatedate">1604263177</span><span class="candidatedate">1604263176</span>

当我尝试查看显示NAN NAN NAN NAN的页面时,该代码在除iOS之外的所有平台上均能正常运行,问题是我无法在ios Safari上调试代码(我没有USB电缆用于我的IPHONE)。有人可以帮我吗?谢谢

4 个答案:

答案 0 :(得分:0)

我强烈建议您使用moment JS使用format方法使此代码可读。

或者至少像这样写它

function formatTime(time) {
   let d = new Date(((time + timeConversion) * 1000));
   return
      ('0' + d.getUTCDate()).slice(-2)
      + '/' +
      ('0' + (d.getUTCMonth() + 1) ).slice(-2)
      + '/' +
      d.getUTCFullYear().toString().substr(2, 4)
      + ' ' + 
      ('0' + d.getUTCHours()).slice(-2)
      + ':' +
      ('0' + d.getUTCMinutes()).slice(-2)
      ;
};

因此您得到了NAN。我的猜测是time变量存在问题。 它来自el.innerHTML,这是一个用parseInt转换的字符串。

您可以尝试显示它以验证值吗? 只需进行一下小的修改?

Array.prototype.forEach.call(allDates, function(el) {
   const before = el.innerHTML;
   const after = formatTime(parseInt(el.innerHTML));
   el.innerHTML = `${before} // ${after}`;
   el.className = "candidatedate";
});

一切都正确,您应该考虑以下事实:该代码不能多次运行...否则它将因诸如parseInt('12/10/20 04:22)之类的代码而失败。因此,也许添加“不进行第二次检查”可能帮助。

答案 1 :(得分:0)

问题源于iOS试图变得非常聪明-并认识到您的时间字符串可能是电话号码。

长度与标准的美国电话号码匹配,因此iOS将它们包装为链接,从而允许用户单击并拨打电话。 1604263177变成<a href="tel:1604263177">1604263177</a>,依此类推。我怀疑Android和其他手机可能会显示类似的行为。

最简单的解决方案是从innerHTML切换到innexText

Array.prototype.forEach.call(allDates, function(el) {
  const input = parseInt(el.innerText, 10);
  el.innerHTML = input ? formatTime(input) : "";
  el.className = "candidatedate";
});

答案 2 :(得分:0)

function formatTime(time){return(new Date(time-  (new Date().getTimezoneOffset()*60000)  ))}
//now basically 1 hr is 60000 units of the unit 'time' so that's my logic
//also new Date(randomTimeStamp) produces a new date off of that recorded timestamp
let d=formatTime(new Date().getTime())
console.log(d.toDateString()+" "+d.toLocaleTimeString()) //im not gonna copy a number when i can make one on the dot for illustration ;]
//also, d is what the actual value u want, i just logged something that seems like it

答案 3 :(得分:0)

更新:

问题是野生动物园会自动将数字转换为链接。

我通过使用:

解决了这个问题
<meta name="format-detection" content="telephone=no">