2010-06-19 260 views
140

有誰知道我可以如何獲取MySQL datetime數據類型值,例如YYYY-MM-DD HH:MM:SS,並解析它或將其轉換爲在JavaScript的Date()函數中工作,例如: - Date('YYYY ,MM,DD,HH,MM,SS);將MySql日期時間戳轉換爲JavaScript的日期格式

謝謝!

+0

然後,在做完所有這些之後,我發現Javascript日期沒有簡單的方法來添加日期... – 2016-07-13 21:04:04

回答

370

一些這裏給出的答案是要麼過於複雜,或只是將無法正常工作(至少不是在所有瀏覽器)。如果退後一步,可以看到MySQL時間戳記的每個時間組成部分與Date()構造函數所需的參數順序相同。

所有這一切需要的是在弦上一個非常簡單的分裂:

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

公平的警告:這是假定你的MySQL服務器輸出UTC時間(這是默認設置,並建議如果沒有時區成分的字符串)。

+1

非常感謝你這個優雅的解決方案!我不得不使用它,因爲Safari似乎無法從MySQL時間戳字符串中自動生成Date對象,例如。 'var d = new Date(「2010-06-09 13:12:01」);'。有趣的是,Chrome並沒有問題。 – alnafie 2012-03-18 15:58:12

+1

值得...對於+1 – 2013-05-09 15:35:34

+0

這是值得這麼多+1,謝謝安迪E – Greg 2013-06-19 09:03:53

-2

在谷歌快速搜索提供這樣的:

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

來源:http://snippets.dzone.com/posts/show/4132

-3

爲什麼不能做到這一點:

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

parseDate不是Date對象的JS方法。最終有一個靜態分析方法,但它只接受1個參數。 – 2011-02-20 16:34:03

57

爲了增加優秀Andy E answer共同使用的功能可能是:

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

在形式"YYYY-MM-DD HH:MM:SS"給予了MySQL的日期/時間這樣或者甚至短版(僅限日期)"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()); 
+1

你應該使用'新日期(Date.UTC(...))'另外明智的答案是錯誤的長達24小時... – user3338098 2015-04-03 14:29:18

7

最新的JavaScript版本將讀取ISO8601格式的日期,因此,所有你需要做的是改變的空間,一個「T」,做類似下列之一:

#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); 
26

我想我可能已經找到一個簡單的方法,沒有人提到。

一個MySQL DATETIME列可以通過轉換爲unix時間戳:

SELECT unix_timestamp(my_datetime_column) as stamp ... 

我們可以通過使用需要,因爲毫秒爲單位的構造函數創建一個新的JavaScript Date對象。該UNIX_TIMESTAMP函數返回秒以來的時代,所以我們需要用1000乘以:

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

結果值可以直接使用實例化一個正確的JavaScript Date對象:

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

希望這有助於。

+2

是的,高效的簡單方法。但是,我會將unix時間戳的乘法(* 1000)推到客戶端(在JavaScript中) – Reinsbrain 2014-04-22 20:52:09

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

+1,因爲它沒有引發正則表達式。 (現在,如果我們可以將它變成一個在線手冊並擺脫這些變量......) – T4NK3R 2014-07-13 05:38:12

2

要進一步添加到Marco的解決方案。我直接原型爲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); 
}; 

這樣你就可以直接進入:

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

一個現代瀏覽器襯墊(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) 

而只是爲了好玩,這裏是一個一行即會在較舊的瀏覽器上工作(現在已修復):

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

第二個例子(「可以在舊版瀏覽器上工作的單線程)」給我一個未來一個月的日期。我認爲這個月參數是零索引的。 – nickyspag 2015-07-29 12:22:59

+0

@nickyspag bummer!使用map()修復它,但不再簡潔。 – aleemb 2015-07-30 16:10:19

+0

優秀的答案..他們都工作,特別是第一個 – 2016-04-07 13:23:45

2

Andy's Answer, 對於AngularJS - 過濾

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

嗨,並感謝jaym。這解決了我爲ios構建的角度應用程序中的破損日期。 – mediaguru 2017-08-29 02:58:42

1

首先,你可以通過拆分YMD格式轉換成組件給JavaScript的Date對象(類),用於將MySQL的YMD日期格式轉換爲JavaScript格式的新方法「fromYMD()」和使用這些日期組件:

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

現在你可以定義自己的對象(在JavaScript世界funcion):

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

,現在您可以簡單地從MySQL日期格式創建日期;

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

您可以使用UNIX時間戳直接:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

然後讓epoch_time成JavaScript,這是一個簡單的問題:由

var myDate = new Date(epoch_time * 1000);

乘法1000是因爲JavaScript需要幾毫秒,而UNIX_TIMESTAMP只需要幾秒鐘。

相關問題