关于JavaScript new Date()和Date.parse()

时间:2010-12-01 04:44:00

标签: javascript date

这是我的代码:

  var exampleDate='23-12-2010 23:12:00';  
  var date=new Date(exampleDate);//returns invalid Date
  var date1=Date.parse(exampleDate);//returns NAN

我想将上面的字符串转换为日期。所以我已经编写了一个代码,如上所示。

此代码在IEOpera中正常运行,但date变量返回无效日期,date1正在NAN返回mozilla Firefox 1}},我该怎么办?

7 个答案:

答案 0 :(得分:25)

示例中的字符串不是浏览器识别的任何标准格式。 ECMAScript规范要求浏览器只能解析一种标准格式:

  

格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

     

此格式包含仅限日期的表格:

     

YYYY

     

YYYY-MM

     

YYYY-MM-DD

     

它还包括附加了可选时区偏移的仅限时间的表单:

     

THH:mm

     

THH:mm:ss

     

THH:mm:ss.sss

     

还包括“日期时间”,其可以是上述的任何组合。

     

如果String不符合该格式,则该函数可能会回退到任何格式   特定于实现的启发式或特定于实现的日期格式。无法识别的字符串或日期   包含格式为String的非法元素值将导致Date.parse返回NaN。

因此,在您的示例中,使用2010-12-23T23:12:00是唯一可以保证工作的字符串。实际上,大多数浏览器还允许格式DD Month YYYYMonth DD, YYYY的日期,因此23 Dec 2010Dec 23, 2010等字符串也可以使用。

答案 1 :(得分:6)

以上格式仅在IE和Chrome中支持。

请尝试使用其他格式。以下是一些格式和支持浏览器。

<script type="text/javascript">

//var dateString = "03/20/2008";  // mm/dd/yyyy [IE, FF]

 var dateString = "2008/03/20";  // yyyy/mm/dd [IE, FF]
// var dateString = "03-20-2008";  // mm-dd-yyyy [IE, Chrome]
// var dateString = "March 20, 2008";  // mmmm dd, yyyy [IE, FF]
// var dateString = "Mar 20, 2008";  // mmm dd, yyyy [IE, FF]

// Initalize the Date object by passing the date string variable
var myDate = new Date(dateString);
alert(myDate); 
</script>

答案 2 :(得分:4)

您可以使用正则表达式手动解析它,然后使用日期元素调用日期构造函数,如下所示:

var parseDate = function(s) {
  var re = /^(\d\d)-(\d\d)-(\d{4}) (\d\d):(\d\d):(\d\d)$/;
  var m = re.exec(s);
  return m ? new Date(m[3], m[2]-1, m[1], m[4], m[5], m[6]) : null;
};
var dateStr = '23-12-2010 23:12:00';
parseDate(dateStr).toString(); //=> Thu Dec 23 2010 23:12:00 GMT-0800

答案 3 :(得分:2)

JavaScript应至少支持以下dateStrings转换:

* yyyy/MM/dd
* MM/dd/yyyy
* MMMM dd, yyyy
* MMM dd, yyyy

尝试:

  var exampleDate='12/23/2010 23:12:00';
  var date = new Date(exampleDate); 

答案 4 :(得分:1)

使用datejs和此代码:

var exampleDate='23-12-2010 23:12:00';
var myDate = Date.parseExact(exampleDate, 'dd-MM-yyyy hh:mm:ss');

myDate应该是一个正确构造的Date对象。

答案 5 :(得分:0)

只需使用以下格式:

var exampleDate='2010-12-23 23:12:00'; 

答案 6 :(得分:0)

@casablanca 有一个很好的答案,但已经 10 多年了,这在 Google 中仍然很重要,所以我想我会更新一个新答案。

TL;DR

OpaquePointer

背景:日期有多种格式,但您大多会收到:

  • ISO 8601 格式日期 (// Use an ISO or Unix time string to generate `Month DD, YYYY` const newDate = new Date('23-12-2010') const simpleDate = `${newDate.toLocaleString('en-us', { month: 'long' } )} ${newDate.getDate()}, ${newDate.getFullYear()}` // yields: December, 23 2010 (if you want date suffix, read until the end) ),其中 YYYY-MM-DDTHH:mm:ss.sssZ 是 UTC 时区偏移量。您也可能会得到它的一个子集(即 Z
  • Unix 时间戳格式日期 (YYYY-MM-DD),其中数字实际上是自 Unix 时间(1970 年 1 月 1 日)开始以来经过的总毫秒数。

基础: JS 有一个内置的 Date 原型,它接受 ISO 8601 和派生词(只是时间或日期)。您可以使用 1539734400 实例化并返回一个日期对象,或者您可以使用 new Date 方法返回一个 Unix 时间戳。

Date.parse()

您还可以将日期分成 7 个参数:年、月(从 0 开始)、日、小时、分钟、秒和毫秒以及时区偏移量 - 注意,我使用了 multi -params 在我的职业生涯中只接近过一次。由于我在德克萨斯州,当我运行以下命令时,我得到了 UTC-5(中部时间):

const dateObj = new Date('23-12-2010:23:12:00') // returns date object
const dateDateOnly = new Date('23-12-2010') // returns date object
const dateTimeOnly = new Date('23:12:00') // returns date object
const dateString = Date.parse('23-12-2010:23:12:00') // returns Unix timestamp string

New-ish Stuff const dateByParam = new Date(2021, 2, 26, 13, 50, 13, 30) // Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time) 通常,toLocaleString 对象的返回仍然非常密集,就像我们上一个示例 (Date) 一样,因此需要额外的方法已添加以帮助开发人员。

通常,对于日期,我想要像 Fri Mar 26 2021 13:50:13 GMT-0500 (Central Daylight Time 这样的东西 - 很长一段时间以来很容易获得日期和年份:

March 21st, 2021

但我总是不得不构建一个函数来将 // Assuming myDate is a JS Date object... myDate.getDate() // date on the calendar, ie 22 myDate.getDay() // day of the week, where 0 means Sunday, 1 means monday, etc myDate.getFullYear() // 4 digit year, ie, 2021 变成 getDay,现在不再需要了。 January, February, March 为您提供一些新的超能力。您可以向它传递两个参数,一个表示区域的字符串(即 toLocaleString())和一个包含您想要返回的内容的对象(即 en-us)。如果需要,这有助于国际化响应。

{ month: 'long' }

日期后缀我仍然没有看到任何内置的方法来获取日期的后缀,比如 // Again, assuming myDate is a JS Date object... myDate.toLocaleString('en-us', { month: 'long' } ) // March ,所以我构建了这个使用模数 {{1} 的实用函数}} 运算符来检查每天数字的除数并应用正确的后缀(针对美国观众,但其他地方可能相同?)。

th, st

现在总而言之..到达这里的路很长,但如果我得到一个 ISO 或 Unix 日期并且我想要 %,这就是我运行的:

/**
 * setDateSuffix()
 * 
 * Desc: Takes two digit date, adds 'st', 'nd', 'rd', etc
 * 
 * @param { integer } num - a number date
 */

export const setDateSuffix = (num) => {
  const j = num % 10,
        k = num % 100

  if (j === 1 && k !== 11) {
    return num + "st";
  }
  if (j === 2 && k !== 12) {
    return num + "nd";
  }
  if (j === 3 && k !== 13) {
    return num + "rd";
  }

  return num + "th";
}

注意 - 当 Month DDth, YYYY 在 JS 中成为现实:https://github.com/tc39/proposal-temporal 时,所有这些都可能会改变,希望变得更好。期待有人在 2030 年更新这篇文章!