Chuyển đổi tem MySql DateTime thành định dạng Ngày của JavaScript


160

Có ai biết làm thế nào tôi có thể lấy một datetimegiá trị loại dữ liệu MySQL , chẳng hạn như YYYY-MM-DD HH:MM:SSvà phân tích nó hoặc chuyển đổi nó để hoạt động trong Date()chức năng của JavaScript , ví dụ: - Ngày ('YYYY, MM, DD, HH, MM, SS);

Cảm ơn bạn!


Sau đó, sau khi thực hiện tất cả những điều này, tôi thấy rằng Ngày Javascript không có cách dễ dàng để thêm ngày ...
Kolob Canyon

Câu trả lời:


418

Một số câu trả lời được đưa ra ở đây là quá phức tạp hoặc sẽ không hoạt động (ít nhất, không phải trong tất cả các trình duyệt). Nếu bạn lùi lại một bước, bạn có thể thấy rằng dấu thời gian của MySQL có từng thành phần thời gian theo cùng thứ tự với các đối số được yêu cầu bởi hàm Date()tạo.

Tất cả những gì cần thiết là một phân chia rất đơn giản trên chuỗi:

// Split timestamp into [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);

// Apply each element to the Date function
var d = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));

console.log(d);
// -> Wed Jun 09 2010 14:12:01 GMT+0100 (BST)

Cảnh báo công bằng: điều này giả định rằng máy chủ MySQL của bạn đang xuất ngày UTC (là mặc định và được khuyến nghị nếu không có thành phần múi giờ của chuỗi).


3
Cảm ơn bạn rất nhiều cho giải pháp thanh lịch này! Tôi đã phải sử dụng nó vì Safari dường như không thể tự động tạo đối tượng Date từ chuỗi dấu thời gian MySQL, vd. var d = new Date("2010-06-09 13:12:01");. Mặc dù thú vị, Chrome không có vấn đề gì với nó.
alnafie

và nghĩ rằng những câu trả lời khác trong đó đề xuất một giải pháp phức tạp hơn. Cảm ơn rất nhiều!
RD

Đây là câu trả lời sai. Câu trả lời đúng được đăng dưới đây bởi Symen Timmermans. Tất cả các ngày được tuần tự hóa (được lưu trữ) dưới dạng một số đếm từng giây (trong trường hợp dấu thời gian unix) hoặc mili giây (javascript) kể từ 1970 UTC. Thao tác các chuỗi ngày được biểu thị bằng số này là một sự lãng phí tài nguyên. Chỉ cần chuyển tem thời gian unix (nhân 1000 cho mili giây) cho nhà xây dựng Ngày javascript (như được đề xuất bởi Symen Timmermans) và bạn đã có nó.
Reinsbrain

1
@Reinsbrain: Đó không phải là câu trả lời sai, chỉ là một câu không phù hợp với yêu cầu của bạn. Có một sự khác biệt. Điều gì xảy ra nếu người triển khai không có quyền truy cập vào mã máy chủ thực hiện truy vấn MySQL (có lẽ là một loại dịch vụ web)? Điều gì sẽ xảy ra nếu việc chỉnh sửa mã phía máy khách dễ dàng hơn vì việc thay đổi nó tại máy chủ có nghĩa là sẽ có nhiều việc hơn? Không có điểm chia tóc trên một vài byte có thể được hiển thị không đáng kể bằng cách gzipping, hoặc mười phần nghìn của một phần nghìn giây cần thiết để tách một chuỗi.
Andy E

4
uh mysql sử dụng một múi giờ và hàm tạo Ngày javascript chỉ chấp nhận múi giờ cục bộ do đó khiến giải pháp này sai đến 24 giờ ... new Date(Date.UTC(...))tốt hơn, nhưng điều đó giả định rằng mysql sử dụng utc ... theo cách này cần phải xem xét trước khi điều này có thể được coi là một câu trả lời chính xác.
dùng3338098

64

Để thêm vào câu trả lời xuất sắc của Andy E, một chức năng sử dụng phổ biến có thể là:

Date.createFromMysql = function(mysql_string)
{ 
   var t, result = null;

   if( typeof mysql_string === 'string' )
   {
      t = mysql_string.split(/[- :]/);

      //when t[3], t[4] and t[5] are missing they defaults to zero
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }

   return result;   
}

Theo cách này, ngày / giờ của MySQL ở dạng "YYYY-MM-DD HH:MM:SS"hoặc thậm chí là dạng ngắn (chỉ ngày) "YYYY-MM-DD"bạn có thể làm:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());

3
bạn nên sử dụng một cách new Date(Date.UTC(...))khôn ngoan khác, câu trả lời sai đến 24 giờ ...
user3338098

30

Tôi nghĩ rằng tôi có thể đã tìm thấy một cách đơn giản hơn, mà không ai đề cập đến.

Một cột MySQL DATETIME có thể được chuyển đổi thành dấu thời gian unix thông qua:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Chúng ta có thể tạo một đối tượng Ngày JavaScript mới bằng cách sử dụng hàm tạo yêu cầu mili giây kể từ thời đại. Hàm unix_timestamp trả về giây kể từ kỷ nguyên, vì vậy chúng ta cần nhân với 1000:

SELECT unix_timestamp(my_datetime_column) * 1000 as stamp ...

Giá trị kết quả có thể được sử dụng trực tiếp để khởi tạo một đối tượng Ngày Javascript chính xác:

var myDate = new Date(<?=$row['stamp']?>);

Hi vọng điêu nay co ich.


4
Có, cách dễ dàng hiệu quả. Nhưng, tôi sẽ đẩy phép nhân (* 1000) của dấu thời gian unix lên máy khách (trong javascript)
Reinsbrain

16

Một lớp lót cho các trình duyệt hiện đại (IE10 +):

var d = new Date(Date.parse("2010-06-09 13:12:01"));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

Và chỉ để giải trí, đây là một lớp lót sẽ hoạt động trên các trình duyệt cũ hơn (hiện đã được sửa):

new (Function.prototype.bind.apply(Date, [null].concat("2010-06-09 13:12:01".split(/[\s:-]/)).map(function(v,i){return i==2?--v:v}) ));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

1
Ví dụ thứ hai ("một lớp lót sẽ hoạt động trên các trình duyệt cũ hơn") cho tôi một ngày một tháng trong tương lai. Tôi nghĩ rằng tháng param là không có chỉ số.
nickyspag 29/07/2015

@nickyspag bummer! đã sửa nó bằng map () nhưng không ngắn gọn nữa.
aleemb

Câu trả lời TUYỆT VỜI .. tất cả họ đều làm việc, đặc biệt là lần đầu tiên
David Addoteye

7

Các phiên bản gần đây của JavaScript sẽ đọc ngày được định dạng ISO8601, vì vậy tất cả những gì bạn phải làm là thay đổi không gian thành 'T', thực hiện một thao tác như sau:

#MySQL
select date_format(my_date_column,'%Y-%m-%dT%T') from my_table;

#PHP
$php_date_str = substr($mysql_date_str,0,10).'T'.substr($mysql_date_str,11,8);

//JavaScript
js_date_str = mysql_date_str.substr(0,10)+'T'+mysql_date_str.substr(11,8);

3

Để thêm hơn nữa vào giải pháp của Marco. Tôi nguyên mẫu trực tiếp đến đối tượng String.

String.prototype.mysqlToDate = String.prototype.mysqlToDate || function() {
    var t = this.split(/[- :]/);
    return new Date(t[0], t[1]-1, t[2], t[3]||0, t[4]||0, t[5]||0);
};

Bằng cách này bạn có thể đi trực tiếp đến:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();

3

Có một cách đơn giản hơn, chuỗi dấu thời gian sql:

2018-07-19 00:00:00

Định dạng gần nhất với dấu thời gian cho Ngày () sẽ nhận là như sau, vì vậy hãy thay thế khoảng trống cho "T":

var dateString = media.intervention.replace(/\s/g, "T");

"2011-10-10T14: 48: 00"

Sau đó, tạo đối tượng ngày:

var date = new Date(dateString);

kết quả sẽ là đối tượng ngày:

Ngày 19 tháng 7 năm 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)


2

Từ câu trả lời của Andy , cho AngularJS - Bộ lọc

angular
    .module('utils', [])
.filter('mysqlToJS', function () {
            return function (mysqlStr) {
                var t, result = null;

                if (typeof mysqlStr === 'string') {
                    t = mysqlStr.split(/[- :]/);

                    //when t[3], t[4] and t[5] are missing they defaults to zero
                    result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);
                }

                return result;
            };
        });

Xin chào và cảm ơn jaym. Điều này đã giải quyết một ngày hỏng trong một ứng dụng góc cạnh mà tôi xây dựng cho ios.
mediaguru

1
var a=dateString.split(" ");
var b=a[0].split("-");
var c=a[1].split(":");
var date = new Date(b[0],(b[1]-1),b[2],b[0],c[1],c[2]);

+1 vì không gợi lên các biểu thức thông thường. (Bây giờ, nếu chúng ta có thể biến nó thành một oneliner và loại bỏ các vars ...)
T4NK3R

1

Trước tiên, bạn có thể cung cấp cho đối tượng Ngày (lớp) của JavaScript phương thức mới 'fromYMD ()' để chuyển đổi định dạng ngày YMD của MySQL thành định dạng JavaScript bằng cách tách định dạng YMD thành các thành phần và sử dụng các thành phần ngày này:

Date.prototype.fromYMD=function(ymd)
{
  var t=ymd.split(/[- :]/); //split into components
  return new Date(t[0],t[1]-1,t[2],t[3]||0,t[4]||0,t[5]||0);
};

Bây giờ bạn có thể xác định đối tượng của riêng mình (funcion trong thế giới JavaScript):

function DateFromYMD(ymd)
{
  return (new Date()).fromYMD(ymd);
}

và bây giờ bạn có thể chỉ cần tạo ngày từ định dạng ngày của MySQL;

var d=new DateFromYMD('2016-07-24');

0

Bạn có thể sử dụng dấu thời gian unix để chỉ đạo:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Sau đó, lấy epoch_time vào JavaScript và đó là một vấn đề đơn giản:

var myDate = new Date(epoch_time * 1000);

Nhân với 1000 là vì JavaScript mất một phần nghìn giây và UNIX_TIMESTAMP cho giây.


-3

Một tìm kiếm nhanh trong google cung cấp điều này:

 function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
  }

Nguồn: http://snippets.dzone.com/posts/show/4132


-4

Tại sao không làm điều này:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );

2
parseDate không phải là một phương thức JS của đối tượng Date. Cuối cùng, có một phương thức phân tích tĩnh nhưng nó chỉ chấp nhận 1 đối số.
Marco Demaio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.