Konversi stempel Dateqime MySql ke dalam format Tanggal JavaScript

160

Adakah yang tahu bagaimana saya bisa mengambil datetimenilai tipe data MySQL , seperti YYYY-MM-DD HH:MM:SSdan menguraikannya atau mengonversinya untuk berfungsi dalam Date()fungsi JavaScript , misalnya: - Date ('YYYY, MM, DD, HH, MM, SS);

Terima kasih!

dzm
sumber
Kemudian setelah melakukan semua ini, saya menemukan bahwa Tanggal Javascript tidak memiliki cara mudah untuk menambahkan tanggal ...
Kolob Canyon

Jawaban:

418

Beberapa jawaban yang diberikan di sini terlalu rumit atau tidak akan berfungsi (setidaknya, tidak di semua browser). Jika Anda mengambil langkah mundur, Anda dapat melihat bahwa stempel waktu MySQL memiliki setiap komponen waktu dalam urutan yang sama dengan argumen yang diperlukan oleh Date()konstruktor.

Semua yang dibutuhkan adalah pemisahan yang sangat sederhana pada string:

// 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)

Peringatan yang adil: ini mengasumsikan bahwa server MySQL Anda mengeluarkan tanggal UTC (yang merupakan default, dan direkomendasikan jika tidak ada komponen zona waktu dari string).

Andy E
sumber
3
Terima kasih banyak atas solusi elegan ini! Saya harus menggunakannya karena Safari tampaknya tidak dapat secara otomatis menghasilkan objek Date dari string cap waktu MySQL misalnya. var d = new Date("2010-06-09 13:12:01");. Meskipun menarik, Chrome tidak memiliki masalah dengannya.
alnafie
dan untuk berpikir bahwa jawaban lain di mana menyarankan solusi yang lebih kompleks. Terima kasih banyak!
RD
Ini jawaban yang salah. Jawaban yang benar diposting di bawah ini oleh Symen Timmermans. Semua tanggal adalah serial (disimpan) sebagai angka yang dihitung detik (dalam hal cap waktu unix) atau milidetik (javascript) sejak 1970 UTC. Memanipulasi string tanggal yang merupakan representasi berbelit-belit dari angka ini adalah pemborosan sumber daya. Cukup berikan cap waktu unix (dikalikan dengan 1000 untuk milidetik) ke konstruktor Tanggal javascript (seperti yang disarankan oleh Symen Timmermans) dan Anda memilikinya.
Reinsbrain
1
@Reinsbrain: Ini bukan jawaban yang salah, hanya satu yang tidak sesuai dengan kebutuhan Anda. Ada perbedaan. Bagaimana jika pelaksana tidak memiliki akses ke kode server melakukan query MySQL (mungkin semacam layanan web)? Bagaimana jika lebih mudah untuk mengedit kode sisi klien karena mengubahnya di server akan berarti lebih banyak pekerjaan? Tidak ada gunanya membelah rambut lebih dari beberapa byte yang bisa dianggap tidak signifikan dengan gzipping, atau seperseribu milidetik diperlukan untuk memisahkan sebuah string.
Andy E
4
eh mysql menggunakan satu zona waktu dan konstruktor Tanggal javascript hanya menerima zona waktu lokal sehingga membuat solusi ini salah hingga 24 jam ... new Date(Date.UTC(...))lebih baik, tetapi itu mengasumsikan bahwa mysql menggunakan utc ... baik cara ini perlu dipertimbangkan sebelum ini dapat dianggap sebagai jawaban yang benar.
user3338098
64

Untuk menambah jawaban Andy E yang luar biasa, fungsi dari penggunaan umum dapat berupa:

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

Dengan cara ini diberikan tanggal / waktu MySQL dalam bentuk "YYYY-MM-DD HH:MM:SS"atau bahkan bentuk pendek (hanya tanggal) "YYYY-MM-DD"yang dapat Anda lakukan:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
Marco Demaio
sumber
3
Anda harus menggunakan pilihan new Date(Date.UTC(...))bijak lain hingga 24 jam ...
user3338098
30

Saya pikir saya mungkin telah menemukan cara yang lebih sederhana, yang tidak seorang pun menyebutkan.

Kolom MySQL DATETIME dapat dikonversi ke cap waktu unix melalui:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Kita dapat membuat objek Tanggal JavaScript baru dengan menggunakan konstruktor yang memerlukan milidetik sejak zaman. Fungsi unix_timestamp mengembalikan detik sejak zaman, jadi kita perlu mengalikan 1000:

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

Nilai yang dihasilkan dapat digunakan secara langsung untuk instantiate objek Javascript Date yang benar:

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

Semoga ini membantu.

Symen Timmermans
sumber
4
Ya, cara mudah yang efisien. Tapi, saya akan mendorong multiplikasi (* 1000) dari cap waktu unix ke klien (dalam javascript)
Reinsbrain
16

Satu liner untuk browser modern (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)

Dan hanya untuk bersenang-senang, ini adalah one-liner yang akan bekerja di browser yang lebih lama (sekarang diperbaiki):

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)
aleemb
sumber
1
Contoh kedua ("satu-baris yang akan bekerja di browser yang lebih lama") memberi saya tanggal satu bulan di masa depan. Saya pikir param bulan tidak diindeks.
nickyspag
Nyebelin @nickyspag! memperbaikinya menggunakan peta () tetapi tidak lagi ringkas.
aleemb
Jawaban yang SANGAT BAIK .. mereka semua berhasil, terutama yang pertama
David Addoteye
7

Versi terbaru JavaScript akan membaca tanggal berformat ISO8601, jadi yang harus Anda lakukan adalah mengubah spasi menjadi 'T', melakukan sesuatu seperti salah satu dari yang berikut:

#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);
Jeff
sumber
3

Untuk menambahkan lebih jauh lagi ke solusi Marco. Saya membuat prototipe langsung ke objek 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);
};

Dengan cara ini Anda bisa langsung ke:

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

Ada cara yang lebih sederhana, string cap waktu sql:

2018-07-19 00:00:00

Format terdekat dengan cap waktu untuk Tanggal () yang akan diterima adalah sebagai berikut, jadi ganti ruang kosong untuk "T":

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

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

Lalu, buat objek tanggal:

var date = new Date(dateString);

hasilnya akan menjadi objek tanggal:

Kamis 19 Juli 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)

Mato Caique
sumber
2

Dari Jawaban Andy , Untuk AngularJS - Filter

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;
            };
        });
jaym
sumber
Hai dan terima kasih untuk jaym. Ini menyelesaikan tanggal yang rusak di aplikasi sudut yang saya buat untuk 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]);
bhowden
sumber
+1 karena tidak membangkitkan ekspresi reguler. (Sekarang, jika kita bisa mengubahnya menjadi oneliner dan menyingkirkan vars ...)
T4NK3R
1

Pertama, Anda dapat memberikan objek Tanggal JavaScript (kelas) metode baru 'dariYMD ()' untuk mengubah format tanggal YMD MySQL ke dalam format JavaScript dengan memecah format YMD menjadi komponen dan menggunakan komponen tanggal ini:

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

Sekarang Anda dapat mendefinisikan objek Anda sendiri (fungsi di dunia JavaScript):

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

dan sekarang Anda cukup membuat tanggal dari format tanggal MySQL;

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

Anda dapat menggunakan cap waktu unix untuk mengarahkan:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Kemudian masukkan epoch_time ke dalam JavaScript, dan ini adalah masalah sederhana:

var myDate = new Date(epoch_time * 1000);

Penggandaan dengan 1000 adalah karena JavaScript membutuhkan milidetik, dan UNIX_TIMESTAMP memberikan detik.

Bharat
sumber
-3

Pencarian cepat di Google menyediakan ini:

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

Sumber: http://snippets.dzone.com/posts/show/4132

Stefan Valianu
sumber
-4

Kenapa tidak melakukan ini:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
sumber
2
parseDate bukan metode JS objek Date. Akhirnya ada metode parse statis tetapi hanya menerima 1 argumen.
Marco Demaio