MySql DateTime damgasını JavaScript'in Tarih biçimine dönüştürme


160

Herkes datetimegibi bir MySQL veri türü değeri alabilir nasıl YYYY-MM-DD HH:MM:SSya da ayrıştırmak veya JavaScript Date()işlevinde çalışmak için dönüştürmek , örneğin: - Tarih ('YYYY, MM, DD, HH, MM, SS);

Teşekkür ederim!


Sonra tüm bunları yaptıktan sonra, Javascript Tarihlerinin tarih eklemek için kolay bir yolu olmadığını görüyorum ...
Kolob Kanyonu

Yanıtlar:


418

Burada verilen cevapların bazıları aşırı karmaşıktır veya sadece işe yaramaz (en azından tüm tarayıcılarda değil). Bir adım geri atarsanız, MySQL zaman damgasının her bir zaman bileşeninin Date()yapıcı tarafından istenen bağımsız değişkenlerle aynı sırada olduğunu görebilirsiniz .

İhtiyaç duyulan tek şey ipte çok basit bir ayrım:

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

Adil uyarı: Bu, MySQL sunucunuzun UTC tarihleri ​​verdiğini varsayar (bu varsayılan değerdir ve dizenin saat dilimi bileşeni yoksa önerilir).


3
Bu zarif çözüm için çok teşekkür ederim! Safari otomatik olarak bir MySQL zaman damgası dize örneğin bir Date nesnesi oluşturmak mümkün görünmüyor çünkü kullanmak zorunda kaldı. var d = new Date("2010-06-09 13:12:01");. İlginçtir, Chrome'un bununla bir sorunu yoktur.
alnafie

ve diğer cevapların daha karmaşık bir çözüm önerdiğini düşünmek Çok teşekkürler!
RD

Bu yanlış cevap. Doğru cevap Symen Timmermans tarafından aşağıda yayınlanmıştır. Tüm tarihler, 1970 UTC'den beri saniye (unix zaman damgası durumunda) veya milisaniye (javascript) sayılan bir sayı olarak serileştirilir (depolanır). Bu sayının kıvrımlı temsili olan tarih dizelerini değiştirmek kaynak israfıdır. Sadece unix zaman damgasını (milisaniye için 1000 ile çarpılır) javascript Date yapıcısına (Symen Timmermans tarafından önerildiği gibi) iletin ve elinizde.
Reinsbrain

1
@Resbrain: Yanlış cevap değil, sadece gereksinimlerinize uygun olmayan bir cevap. Bir fark var. Uygulayıcının MySQL sorgusunu gerçekleştiren sunucu koduna erişimi yoksa (belki bir tür web servisi) ne olur? İstemci tarafı kodunu düzenlemek daha kolaysa, sunucuda değiştirmek daha fazla iş anlamına gelir mi? Tüyleri birkaç bayt üzerinde bölmenin, gzipleme ile önemsiz hale getirilebileceği veya bir dizeyi bölmek için gereken milisaniyenin on binde biri kadar bir anlamı yoktur.
Andy E

4
uh mysql bir saat dilimi kullanır ve javascript Date yapıcısı yalnızca yerel saat dilimini kabul eder, bu nedenle bu çözümü 24 saate kadar yanlış hale getirir ... new Date(Date.UTC(...))daha iyidir, ancak mysql'nin utc kullandığını varsayar ... her iki şekilde de bundan önce düşünülmüşse doğru bir cevap olarak düşünülebilir.
user3338098

64

Mükemmel Andy E cevap eklemek için ortak kullanım bir işlevi olabilir:

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

Bu şekilde, formdaki bir MySQL tarih / saati "YYYY-MM-DD HH:MM:SS"veya hatta kısa form (yalnızca tarih) verildiğinde "YYYY-MM-DD":

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

3
new Date(Date.UTC(...))cevabı 24 saate kadar yanlış başka akıllıca kullanmalısınız ...
user3338098

30

Sanırım kimsenin bahsetmediği daha basit bir yol bulmuş olabilirim.

Bir MySQL DATETIME sütunu, aşağıdakiler aracılığıyla bir unix zaman damgasına dönüştürülebilir:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Dönemden bu yana milisaniye gerektiren yapıcıyı kullanarak yeni bir JavaScript Tarihi nesnesi oluşturabiliriz. Unix_timestamp işlevi dönemden bu yana saniyeler döndürür, bu nedenle 1000 ile çarpmamız gerekir:

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

Ortaya çıkan değer doğrudan doğru bir Javascript Date nesnesini başlatmak için kullanılabilir:

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

Bu yardımcı olur umarım.


4
Evet, etkili kolay yol. Ancak, unix zaman damgasının çarpımını (* 1000) istemciye (javascript)
iterim

16

Modern tarayıcılar için bir astar (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)

Ve sadece eğlence için, eski tarayıcılarda (şimdi düzeltildi) çalışacak tek astar:

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
İkinci örnek ("eski tarayıcılarda çalışacak tek satırlı") bana gelecek ayın bir tarihini veriyor. Bence ay parametresi sıfır endekslidir.
nickyspag

@nickyspag bummer! map () kullanarak düzeltildi ancak artık özlü değil.
aleemb

MÜKEMMEL cevap .. hepsi işe yaradı, özellikle ilk
David Addoteye

7

JavaScript'in son sürümleri ISO8601 biçiminde bir tarih okuyacaktır, bu nedenle tek yapmanız gereken alanı 'T' olarak değiştirmek ve aşağıdakilerden biri gibi bir şey yapmaktır:

#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

Marco'nun çözümüne daha da fazla eklemek için. Doğrudan String nesnesine prototip yaptım.

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

Bu şekilde doğrudan şuraya gidebilirsiniz:

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

3

Daha basit bir yol var, sql zaman damgası dizesi:

2018-07-19 00:00:00

Date () için alınacak zaman damgasına en yakın biçim şöyledir, bu nedenle "T" için boş alanı değiştirin:

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

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

Ardından, tarih nesnesini oluşturun:

var date = new Date(dateString);

sonuç tarih nesnesi olur:

Perş 19 Tem 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)


2

Gönderen Andy'nin Yanıt , angularjs için - Filtre

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

Merhaba ve jaym'e teşekkürler. Bu, ios için oluşturduğum bir açısal uygulamada kırık bir tarihi çözdü.
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]);

Düzenli ifadeleri çağırmadığı için +1. (Şimdi, bir oneliner haline getirebilir ve değişkenlerden kurtulabilirsek ...)
T4NK3R

1

Öncelikle, YMD biçimini bileşenlere bölerek ve şu tarih bileşenlerini kullanarak MySQL'in YMD tarih biçimini JavaScript biçimine dönüştürmek için JavaScript'in Date nesnesine (sınıf) yeni 'fromYMD ()' yöntemini verebilirsiniz:

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

Artık kendi nesnenizi tanımlayabilirsiniz (JavaScript dünyasında işlev):

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

ve şimdi MySQL tarih biçiminden tarih oluşturabilirsiniz;

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

0

Yönlendirmek için unix zaman damgasını kullanabilirsiniz:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Sonra epoch_time'ı JavaScript'e dönüştürün ve basit bir mesele:

var myDate = new Date(epoch_time * 1000);

1000 ile çarpma, JavaScript'in milisaniye alması ve UNIX_TIMESTAMP'ın saniye vermesidir.


-3

Google'da hızlı bir arama şunları sağladı:

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

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


-4

Bunu neden yapmıyorsunuz:

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

2
parseDate, Date nesnesinin bir JS yöntemi değildir. Sonunda statik bir ayrıştırma yöntemi vardır, ancak yalnızca 1 argümanı kabul eder.
Marco Demaio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.