在JavaScript中将字符串转换为日期

问题描述 投票:526回答:32

如何在JavaScript中将字符串转换为日期?

var st = "date in some format"
var dt = new date();

var dt_st= //st in date format same as dt
javascript date type-conversion
32个回答
706
投票

字符串解析的最佳字符串格式是日期ISO格式以及JavaScript Date对象构造函数。

ISO格式的示例:YYYY-MM-DDYYYY-MM-DDTHH:MM:SS

可是等等!仅使用“ISO格式”本身并不可靠。字符串有时被解析为UTC,有时也被解析为本地时间(基于浏览器供应商和版本)。最佳做法应始终是将日期存储为UTC并将计算作为UTC进行计算。

要将日期解析为UTC,请附加Z - 例如:new Date('2011-04-11T10:20:30Z')

要以UTC格式显示日期,请使用.toUTCString(), 要在用户的当地时间显示日期,请使用.toString()

有关MDN | Datethis answer的更多信息。

对于旧的Internet Explorer兼容性(小于9的IE版本在Date构造函数中不支持ISO格式),您应该将日期时间字符串表示形式拆分为它的部分,然后您可以使用构造函数使用日期时间部分,例如:new Date('2011', '04' - 1, '11', '11', '51', '00')。请注意,月份数必须少1。


替代方法 - 使用适当的库:

您还可以利用库Moment.js,它允许使用指定的时区解析日期。


11
投票

对于那些正在寻找一个小巧聪明的解决方案的人:

String.prototype.toDate = function(format)
{
  var normalized      = this.replace(/[^a-zA-Z0-9]/g, '-');
  var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
  var formatItems     = normalizedFormat.split('-');
  var dateItems       = normalized.split('-');

  var monthIndex  = formatItems.indexOf("mm");
  var dayIndex    = formatItems.indexOf("dd");
  var yearIndex   = formatItems.indexOf("yyyy");
  var hourIndex     = formatItems.indexOf("hh");
  var minutesIndex  = formatItems.indexOf("ii");
  var secondsIndex  = formatItems.indexOf("ss");

  var today = new Date();

  var year  = yearIndex>-1  ? dateItems[yearIndex]    : today.getFullYear();
  var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
  var day   = dayIndex>-1   ? dateItems[dayIndex]     : today.getDate();

  var hour    = hourIndex>-1      ? dateItems[hourIndex]    : today.getHours();
  var minute  = minutesIndex>-1   ? dateItems[minutesIndex] : today.getMinutes();
  var second  = secondsIndex>-1   ? dateItems[secondsIndex] : today.getSeconds();

  return new Date(year,month,day,hour,minute,second);
};

例:

"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");

11
投票

Timestamps should be casted to a Number

var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works

var invalidDate = new Date('1471793029764'); // does not work. Invalid Date

9
投票

qazxsw poi几乎可以获得你想要的东西。它在qazxsw poi / qazxsw poi部分窒息,但有一些黑客你可以让它工作:

Date.parse

7
投票

看看datejs图书馆am


7
投票

只是pm

假设它是正确的格式。


4
投票

转换为pt-BR格式:

var str = 'Sun Apr 25, 2010 3:30pm',
    timestamp;

timestamp = Date.parse(str.replace(/[ap]m$/i, ''));

if(str.match(/pm$/i) >= 0) {
    timestamp += 12 * 60 * 60 * 1000;
}

我希望能帮助别人!


4
投票

我为此创建了一个小提琴,您可以在任何日期字符串上使用toDate()函数并提供日期格式。这将返回Date对象。 http://www.datejs.com/

new Date(st);

4
投票

我使用此函数将任何Date对象转换为UTC Date对象。

    var dateString = "13/10/2014";
    var dataSplit = dateString.split('/');
    var dateConverted;

    if (dataSplit[2].split(" ").length > 1) {

        var hora = dataSplit[2].split(" ")[1].split(':');
        dataSplit[2] = dataSplit[2].split(" ")[0];
        dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);

    } else {
        dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
    }

3
投票

对于在js中сonverting字符串到日期我使用https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")

3
投票

你可以试试这个:

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());

232
投票

不幸的是我发现了

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

返回“2014年4月2日星期三”。我知道这听起来很疯狂,但有些用户会这样做。

防弹解决方案如下:

var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]); 
console.log(mydate.toDateString());

2
投票

还有另一种方法:

http://momentjs.com/

1
投票
moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd');                    // Sunday
moment().format("MMM Do YY");               // Aug 16th 15
moment().format('YYYY [escaped] YYYY');     // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow();        // 16 hours ago
moment().endOf('day').fromNow();          // in 8 hours

要么

function formatDate(userDOB) {
  const dob = new Date(userDOB);

  const monthNames = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
     'August', 'September', 'October', 'November', 'December'
  ];

  const day = dob.getDate();
  const monthIndex = dob.getMonth();
  const year = dob.getFullYear();

  // return day + ' ' + monthNames[monthIndex] + ' ' + year;
  return `${day} ${monthNames[monthIndex]} ${year}`;
}

console.log(formatDate('1982-08-10'));

格式为'01 -01-1970'的日期字符串在FireFox中不起作用,因此最好在日期格式字符串中使用“/”而不是“ - ”。


1
投票

如果在转换为Date格式之前需要检查字符串的内容:

String.prototype.toDate = function(format) {
    format = format || "dmy";
    var separator = this.match(/[^0-9]/)[0];
    var components = this.split(separator);
    var day, month, year;
    for (var key in format) {
        var fmt_value = format[key];
        var value = components[key];
        switch (fmt_value) {
            case "d":
                day = parseInt(value);
                break;
            case "m":
                month = parseInt(value)-1;
                break;
            case "y":
                year = parseInt(value);
        }
    }
    return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z

1
投票

var date = new Date(year, month, day);

1
投票

您可以使用正则表达式来解析字符串到详细时间,然后创建日期或任何返回格式,如:

var date = new Date('01/01/1970');

1
投票

我写了一个可重用的函数,当我从服务器获取日期字符串时,我使用它。 您可以传递分隔日月和年的所需分隔符(/ - 等..)以使用// Convert 'M/D/YY' to Date() mdyToDate = function(mdy) { var d = mdy.split(/[\/\-\.]/, 3); if (d.length != 3) return null; // Check if date is valid var mon = parseInt(d[0]), day = parseInt(d[1]), year= parseInt(d[2]); if (d[2].length == 2) year += 2000; if (day <= 31 && mon <= 12 && year >= 2015) return new Date(year, mon - 1, day); return null; } 方法。 你可以在这个var a = "13:15" var b = toDate(a, "h:m") alert(b); function toDate(dStr, format) { var now = new Date(); if (format == "h:m") { now.setHours(dStr.substr(0, dStr.indexOf(":"))); now.setMinutes(dStr.substr(dStr.indexOf(":") + 1)); now.setSeconds(0); return now; } else return "Invalid Format"; }上看到并测试它。

//example : let dateString = "2018-08-17 01:02:03.4"

function strToDate(dateString){
    let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
  , [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
  return dateObject;
}
alert(strToDate(dateString));

0
投票

ISO 8601-esque datetrings,与标准一样优秀,仍然没有得到广泛支持。

这是一个很好的资源,可以确定应该使用哪种日期字符串格式:

split()

是的,这意味着你的日期字符串可以简单到与之相反

working example而不是<!DOCTYPE html> <html> <head> <style> </style> </head> <body> <div> <span>day: </span> <span id='day'> </span> </div> <div> <span>month: </span> <span id='month'> </span> </div> <div> <span>year: </span> <span id='year'> </span> </div> <br/> <input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/> <span>28/10/1980 </span> <script> function convert(delimiter,dateString) { var splitted = dateString.split('/'); // create a new date from the splitted string var myDate = new Date(splitted[2],splitted[1],splitted[0]); // now you can access the Date and use its methods document.getElementById('day').innerHTML = myDate.getDate(); document.getElementById('month').innerHTML = myDate.getMonth(); document.getElementById('year').innerHTML = myDate.getFullYear(); } </script> </body> </html>



0
投票

使用此代码:(我的问题已通过此代码解决)

"2014/10/13 23:57:52"

}


0
投票

我已创建parseDateTime函数将字符串转换为日期对象,它在所有浏览器(包括IE浏览器)中工作,检查是否有人需要,参考"2014-10-13 23:57:52"

                //little bit of code for Converting dates 

                var dat1 = document.getElementById('inputDate').value;
                var date1 = new Date(dat1)//converts string to date object
                alert(date1);
                var dat2 = document.getElementById('inputFinishDate').value;
                var date2 = new Date(dat2)
                alert(date2);

109
投票
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

输出将是:

dt => Date {Fri Apr 26 2013}

-1
投票

另一种方法是在格式字符串上构建一个带有命名捕获组的正则表达式,然后使用该正则表达式从日期字符串中提取日期,月份和年份:

function dateDiff(date1, date2){
var diff = {}                           // Initialisation du retour
var tmp = date2 - date1;

tmp = Math.floor(tmp/1000);             // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60;                    // Extraction du nombre de secondes

tmp = Math.floor((tmp-diff.sec)/60);    // Nombre de minutes (partie entière)
diff.min = tmp % 60;                    // Extraction du nombre de minutes

tmp = Math.floor((tmp-diff.min)/60);    // Nombre d'heures (entières)
diff.hour = tmp % 24;                   // Extraction du nombre d'heures

tmp = Math.floor((tmp-diff.hour)/24);   // Nombre de jours restants
diff.day = tmp;

return diff;

75
投票
function stringToDate(_date,_format,_delimiter)
{
            var formatLowerCase=_format.toLowerCase();
            var formatItems=formatLowerCase.split(_delimiter);
            var dateItems=_date.split(_delimiter);
            var monthIndex=formatItems.indexOf("mm");
            var dayIndex=formatItems.indexOf("dd");
            var yearIndex=formatItems.indexOf("yyyy");
            var month=parseInt(dateItems[monthIndex]);
            month-=1;
            var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
            return formatedDate;
}

stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")

31
投票

将它作为参数传递给Date():

var st = "date in some format"
var dt = new Date(st);

您可以使用例如:dt.getMonth()访问日期,月份和年份。


22
投票

moment.js(http://momentjs.com/)是一个完整而优秀的使用日期包,并支持ISO 8601 strings

您可以添加字符串日期和格式。

moment("12-25-1995", "MM-DD-YYYY");

你可以检查一个日期是否有效。

moment("not a real date").isValid(); //Returns false

请参阅文档http://momentjs.com/docs/#/parsing/string-format/

建议:我建议使用包含很多格式的日期,因为时区和格式时间管理确实是一个大问题,时刻js解决了很多格式。您可以从简单的字符串中轻松解析日期,但我认为这是支持所有格式和日期变体的艰苦工作。


18
投票

new Date(2000, 10, 1)将给你“Wed Wed 01 2000 00:00:00 GMT + 0100(CET)”

看到0月份给你一月


17
投票

如果您可以使用极好的moment库(例如在Node.js项目中),您可以使用例如日期轻松解析日期。

var momentDate = moment("2014-09-15 09:00:00");

并可以通过访问JS日期对象

momentDate ().toDate();

11
投票

如果你想转换格式“dd / MM / yyyy”。这是一个例子:

var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);

此解决方案适用于小于9的IE版本。

© www.soinside.com 2019 - 2024. All rights reserved.