【问题标题】:Why new date() is not accepting string and give invalid date?为什么 new date() 不接受字符串并给出无效日期?
【发布时间】:2018-05-18 07:07:53
【问题描述】:

Javascript:我有一个函数,它有 s 参数 s 包含这个 s=07:05:45PM;s 有时间,它是字符串的形式,我想在 new Date() 中使用它,但是给出了错误,我必须得到小时分钟秒转换这次改为24小时格式请帮我输出:无效日期

function time Conversion(s) { 
   var date=new Date(s);    
   console.log(date); 
}

【问题讨论】:

  • 您在给时间并希望将其识别为日期?此外, new date(String) 将需要 Date.parse() 方法识别的字符串。
  • 我的理解是您想将给定的时间字符串转换为 24 小时格式。对吗?
  • 是的,我想转换成 24 小时格式

标签: javascript function date


【解决方案1】:

根据specification,可以将dateString作为参数传递给Date构造函数。有一堆dateString 格式限制,在您的情况下,您的dateString(名为s)对于日期构造函数无效(实际上,您的s 甚至没有任何日期,它仅包含时间) .

可能的解决方案是手动处理你的s参数:削减口头部分,将时间按:分割,然后将参数依次传递给Date构造函数year, month, date, hours, minutes, seconds,或者构造你自己的ISO String,格式:

{year}-{month}-{date}T{hours}:{minutes}:{seconds}.{milliseconds}Z

请注意,两种情况下的小时数都应采用 24 小时格式,因此您应该手动处理 12 小时格式的小时数。

【讨论】:

  • OP 有一个没有日期的时间。建议的字符串格式将被解析为 UTC,应该包含如何处理的代码。此外,将时间转换为 24 小时格式也没有任何帮助(建议的格式也需要这种格式),这是问题的核心。
  • @RobG 好吧,谢谢你的评论。我一有空就会更新我的答案。
  • 哦,您对“规范”的引用实际上是 MDN,它是一个公共 wiki。实际规范是 ECMA-262,当前版本是 ECMAScript 2017,很快就会成为 ECMAScript 2018。;-)
  • @RobG ...以及所有必要的“真实规范”链接都在 MDN 上。不同的是,在 MDN 上,所有信息都更容易理解。
  • 当然,但是虽然 MDN 是一个很好的资源,但它不是一个规范。它将自己描述为JavaScript reference。 :-)
【解决方案2】:

Why does Date.parse give incorrect results? 涵盖了您从内置解析器获取无效日期的原因

要将像 07:05:45PM 这样的字符串转换为 24 小时制,您可以解析这些部分并生成一个新字符串,如果它以 PM 结尾,则将 12 添加到小时,如果它以 AM 结尾(并更改 12am到 00)。例如

function to24HrFormat(s) {
  var z = n => (n<10?'0':'')+n;
  var b = s.match(/\d+/g);
  var ap = /am$/i.test(s)? 0 : 12;
  return z((b[0]%12) + ap) + ':' + b[1] + ':' + b[2];
}

// Tests
['07:05:45PM', '06:23:49AM', '12:15:00AM', '11:59:59pm']
  .forEach(s => console.log(s + ' => ' + to24HrFormat(s)));

您应该验证输入字符串,并可能允许丢失秒数。

【讨论】:

    【解决方案3】:

    从时间字符串中去掉 AM/PM(需要有 24 小时的时间字符串)

    var time = "07:05:45";
    var datetime = new Date('1970-01-01T' + time + 'Z');
    

    现在进行基于时间的操作。

    【讨论】:

    • 至少在 Safari、Chrome 和 Firefox 中使用“07:05:45PM”的 OP 字符串会产生无效的日期。如果 PM 被删除,则时间错误,并且添加“Z”意味着它将被解析为 UTC,因此将时间偏移本地时区偏移量。您可能希望包括如何处理所有这些。
    • 在发布之前在最新的 Chrome 中尝试过 ?
    • 试试new Date('1970-01-01T' + '07:05:45PM' + 'Z');,这就是OP所拥有的。如果没有上午/下午,它应该是“19:05:45”,而像“12:15:00AM”这样的时间必须是“00:15:00”。
    【解决方案4】:

    尝试改用Date.parse(string)。见referene

    【讨论】:

    • 那我给NAN
    • Date 构造函数解析字符串和 Date.parse 是 specified 一样,唯一的区别是 Date.parse 返回一个时间值(可能为 NaN),而 new Date 返回一个 Date,该 Date 由 Date.parse 返回的时间值构成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2020-03-24
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多