Helpex - Trao đổi & giúp đỡ Đăng nhập
497

Làm cách nào tôi có thể chuyển đổi một chuỗi thành một ngày trong JavaScript?

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

var dt_st= //st in date format same as dt
497 hữu ích 3 bình luận 1.4m xem chia sẻ
32 trả lời 32
654

Định dạng chuỗi tốt nhất để phân tích chuỗi là định dạng ISO ngày cùng với hàm tạo đối tượng Ngày JavaScript.

Ví dụ về định dạng ISO: YYYY-MM-DDhoặc YYYY-MM-DDTHH:MM:SS.

Nhưng chờ đã! Chỉ sử dụng "định dạng ISO" không hoạt động đáng tin cậy. Chuỗi đôi khi được phân tích cú pháp dưới dạng UTC và đôi khi là giờ địa phương (dựa trên nhà cung cấp và phiên bản trình duyệt). Cách thực hành tốt nhất phải luôn là lưu trữ ngày dưới dạng UTC và tính toán dưới dạng UTC.

Để phân tích một ngày là UTC, hãy thêm Z - ví dụ : new Date('2011-04-11T10:20:30Z').

Để hiển thị một ngày trong UTC, hãy sử dụng .toUTCString(),
để hiển thị một ngày theo giờ địa phương của người dùng, sử dụng .toString().

Thêm thông tin về MDN | Ngàycâu trả lời này .

Để tương thích Internet Explorer cũ (các phiên bản IE dưới 9 không hỗ trợ định dạng ISO trong Trình tạo ngày), bạn nên chia biểu diễn chuỗi datetime cho các phần của nó và sau đó bạn có thể sử dụng hàm tạo bằng các phần datetime, ví dụ : new Date('2011', '04' - 1, '11', '11', '51', '00'). Lưu ý rằng số tháng phải ít hơn 1.


Phương pháp thay thế - sử dụng một thư viện thích hợp:

Bạn cũng có thể tận dụng thư viện Moment.js cho phép phân tích ngày theo múi giờ đã chỉ định.

654 hữu ích 5 bình luận chia sẻ
210

Thật không may, tôi phát hiện ra rằng

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

trả về "Thứ tư ngày 02 tháng 4 năm 2014". Tôi biết nó nghe có vẻ điên rồ, nhưng nó xảy ra với một số người dùng.

Các giải pháp chống đạn như sau:

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());

210 hữu ích 5 bình luận chia sẻ
105
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));

Và đầu ra sẽ là:

dt => Date {Fri Apr 26 2013}
105 hữu ích 1 bình luận chia sẻ
71
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","-")
71 hữu ích 3 bình luận chia sẻ
29

Truyền nó làm đối số cho Date ():

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

Bạn có thể truy cập ngày, tháng, năm bằng cách sử dụng, ví dụ : dt.getMonth().

29 hữu ích 3 bình luận chia sẻ
18

new Date(2000, 10, 1) sẽ cung cấp cho bạn "Thứ tư ngày 01 tháng 11 năm 2000 00:00:00 GMT + 0100 (CET)"

Xem 0 cho tháng mang lại cho bạn tháng một

18 hữu ích 0 bình luận chia sẻ
18

Moment.js ( http://momentjs.com/ ) là gói hoàn chỉnh và tốt để sử dụng ngày và hỗ trợ chuỗi ISO 8601 .

Bạn có thể thêm ngày chuỗi và định dạng.

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

Và bạn có thể kiểm tra xem một ngày có hợp lệ không.

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

Xem tài liệu http://momentjs.com/docs/#/parsing/opes-format/

Khuyến nghị: Tôi khuyên bạn nên sử dụng gói cho ngày chứa nhiều định dạng vì quản lý thời gian và định dạng thời gian thực sự là một vấn đề lớn, thời điểm js giải quyết rất nhiều định dạng. Bạn có thể dễ dàng phân tích ngày từ một chuỗi đơn giản cho đến ngày nhưng tôi nghĩ rằng đó là một công việc khó khăn để hỗ trợ tất cả các định dạng và biến thể của ngày.

18 hữu ích 0 bình luận chia sẻ
17

Nếu bạn có thể sử dụng thư viện khoảnh khắc tuyệt vời (ví dụ: trong dự án Node.js), bạn có thể dễ dàng phân tích ngày của mình bằng cách sử dụng, ví dụ:

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

và có thể truy cập đối tượng ngày JS thông qua

momentDate ().toDate();
17 hữu ích 2 bình luận chia sẻ
11

Đối với những người đang tìm kiếm một giải pháp nhỏ bé và thông minh:

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);
};

Thí dụ:

"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 hữu ích 0 bình luận chia sẻ
11

Dấu thời gian nên được chuyển thành Số

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
11 hữu ích 3 bình luận chia sẻ
10

Nếu bạn muốn chuyển đổi từ định dạng "dd / MM / yyyy". Đây là một ví dụ:

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]);

Giải pháp này hoạt động trong các phiên bản IE dưới 9.

10 hữu ích 0 bình luận chia sẻ
9

Date.parsegần như có được bạn những gì bạn muốn. Nó sặc trên am/ pmphần, nhưng với một số hack bạn có thể làm cho nó hoạt động:

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;
}
9 hữu ích 0 bình luận chia sẻ
6

kiểm tra thư viện datejs http://www.datejs.com/

6 hữu ích 1 bình luận chia sẻ
6

Chỉ new Date(st);

Giả sử rằng đó là định dạng phù hợp.

6 hữu ích 0 bình luận chia sẻ
4

Chuyển đổi sang định dạng pt-BR:

    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]);
    }

Tôi hy vọng giúp được ai đó !!!

4 hữu ích 0 bình luận chia sẻ
4

Tôi đã tạo một fiddle cho điều này, bạn có thể sử dụng hàm toDate () trên bất kỳ chuỗi ngày nào và cung cấp định dạng ngày. Điều này sẽ trả về cho bạn một đối tượng Date. https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")
4 hữu ích 0 bình luận chia sẻ
3

Để chuyển đổi chuỗi thành ngày trong js tôi sử dụng http://momentjs.com/

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
3 hữu ích 1 bình luận chia sẻ
3

Tôi đã thực hiện chức năng này để chuyển đổi bất kỳ đối tượng Ngày nào thành đối tượng Ngày UTC.

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


dateToUTC(new Date());
3 hữu ích 0 bình luận chia sẻ
2

Một cách khác để làm điều đó:

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
2 hữu ích 0 bình luận chia sẻ
1
var date = new Date(year, month, day);

hoặc là

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

chuỗi ngày ở định dạng '01 -01-1970 'sẽ không hoạt động trong FireFox, vì vậy tốt hơn nên sử dụng "/" thay vì "-" trong chuỗi định dạng ngày.

1 hữu ích 4 bình luận chia sẻ
1

Nếu bạn cần kiểm tra nội dung của chuỗi trước khi chuyển đổi sang định dạng Ngày:

// 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; 
}
1 hữu ích 0 bình luận chia sẻ
1

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";
}

1 hữu ích 0 bình luận chia sẻ
1

Bạn có thể sử dụng regex để phân tích chuỗi để chi tiết thời gian sau đó tạo ngày hoặc bất kỳ định dạng trả lại nào như:

//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));
1 hữu ích 0 bình luận chia sẻ
1

Bạn có thể thử điều này:

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'));

1 hữu ích 1 bình luận chia sẻ
1

Tôi đã viết một hàm có thể sử dụng lại mà tôi sử dụng khi tôi nhận được chuỗi ngày từ máy chủ.
bạn có thể vượt qua dấu phân cách mong muốn (/ - v.v.) phân tách ngày tháng và năm để sử dụng split()phương thức.
bạn có thể xem và kiểm tra nó trên ví dụ làm việc này .

<!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>
1 hữu ích 0 bình luận chia sẻ
0

ISO 8601-esque datestrings, tuyệt vời như tiêu chuẩn, vẫn không được hỗ trợ rộng rãi.

Đây là một tài nguyên tuyệt vời để tìm ra định dạng dữ liệu bạn nên sử dụng:

http://dygraphs.com/date-formats.html

Vâng, điều đó có nghĩa là việc đánh dấu dữ liệu của bạn có thể đơn giản như trái ngược với

"2014/10/13 23:57:52" thay vì "2014-10-13 23:57:52"

0 hữu ích 0 bình luận chia sẻ
0
                //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);
0 hữu ích 0 bình luận chia sẻ
0

sử dụng mã này: (vấn đề của tôi đã được giải quyết với mã này)

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;

}

0 hữu ích 3 bình luận chia sẻ
0

Tôi đã tạo hàm parseDateTime để chuyển đổi chuỗi thành đối tượng ngày và nó đang hoạt động trong tất cả các trình duyệt (bao gồm cả trình duyệt IE), kiểm tra xem có ai yêu cầu không, tham khảo https://github.com/Umesh-Markande/Pude-String-to-Date -tất cả trình duyệt

    function parseDateTime(datetime) {
            var monthNames = [
                "January", "February", "March",
                "April", "May", "June", "July",
                "August", "September", "October",
                "November", "December"
              ];
            if(datetime.split(' ').length == 3){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1].replace('.00','');
                var timearray = time.split(':');
                var hours = parseInt(time.split(':')[0]);
                var format = datetime.split(' ')[2];
                var bits = date.split(/\D/);
                date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = date.getDate();
                var monthIndex = date.getMonth();
                var year = date.getFullYear();
                if ((format === 'PM' || format === 'pm') && hours !== 12) {
                    hours += 12;
                    try{  time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
                } 
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime.split(' ').length == 2){
                var date = datetime.split(' ')[0];
                var time = datetime.split(' ')[1];
                var bits = date.split(/\D/);
                var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                var day = datetimevalue.getDate();
                var monthIndex = datetimevalue.getMonth();
                var year = datetimevalue.getFullYear();
                var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + '  ' + year + ' ' + time);
                return formateddatetime;
            }else if(datetime != ''){
                var bits = datetime.split(/\D/);
                var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
                return date;
            }
            return datetime;
        }

    var date1 = '2018-05-14 05:04:22 AM';   // yyyy-mm-dd hh:mm:ss A
    var date2 = '2018/05/14 05:04:22 AM';   // yyyy/mm/dd hh:mm:ss A
    var date3 = '2018/05/04';   // yyyy/mm/dd
    var date4 = '2018-05-04';   // yyyy-mm-dd
    var date5 = '2018-05-14 15:04:22';   // yyyy-mm-dd HH:mm:ss
    var date6 = '2018/05/14 14:04:22';   // yyyy/mm/dd HH:mm:ss

    console.log(parseDateTime(date1))
    console.log(parseDateTime(date2))
    console.log(parseDateTime(date3))
    console.log(parseDateTime(date4))
    console.log(parseDateTime(date5))
    console.log(parseDateTime(date6))

**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)
0 hữu ích 0 bình luận chia sẻ
0

Một cách khác để làm điều đó là xây dựng một biểu thức chính quy với các nhóm chụp được đặt tên qua chuỗi định dạng và sau đó sử dụng biểu thức chính đó để trích xuất ngày, tháng và năm từ chuỗi ngày:

function parseDate(dateStr, format) {
  const regex = format.toLocaleLowerCase()
    .replace(/\bd+\b/, '(?<day>\\d+)')
    .replace(/\bm+\b/, '(?<month>\\d+)')
    .replace(/\by+\b/, '(?<year>\\d+)')
  
  const parts = new RegExp(regex).exec(dateStr) || {};
  const { year, month, day } = parts.groups || {};
  return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}

const printDate = x => console.log(x ? x.toLocaleDateString() : x);

printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript date type-conversion , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading