MySql DateTimeスタンプをJavaScriptの日付形式に変換する


160

datetimeたとえば、MySQL データ型の値を取得して、YYYY-MM-DD HH:MM:SS解析するか、JavaScriptのDate()関数で機能するように変換する方法を知っている人はいますか?

ありがとうございました!


次に、これらすべてを実行した後、JavaScriptの日付に日付を追加する簡単な方法がないことがわかりました...
Canyon

回答:


418

ここに記載されている回答の一部は複雑すぎるか、まったく機能しません(少なくとも、すべてのブラウザーでは機能しません)。少し前に戻ると、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日付を出力することを前提としています(これはデフォルトであり、文字列のタイムゾーンコンポーネントがない場合は推奨されます)。


3
このエレガントなソリューションを本当にありがとう!Safariは、MySQLタイムスタンプ文字列からDateオブジェクトを自動的に生成できないようです。var d = new Date("2010-06-09 13:12:01");。興味深いことに、Chromeには問題はありません。
アルナフィー

そして、より複雑なソリューションを提案している他の答えを考える。どうもありがとう!
RD

これは間違った答えです。正解はシメンティマーマンスによって以下に掲載されています。すべての日付は、1970 UTC以降、秒(UNIXタイムスタンプの場合)またはミリ秒(JavaScript)をカウントする数値としてシリアル化(保存)されます。この数値の複雑な表現である日付文字列の操作は、リソースの浪費です。UNIXタイムスタンプ(ミリ秒に1000を掛けたもの)をjavascript Dateコンストラクター(Symen Timmermansが推奨)に渡すだけで、それが得られます。
Reinsbrain 14

1
@Reinsbrain:それは間違った答えではなく、あなたの要件に合わなかったものだけです。違いがあります。実装者がMySQLクエリを実行するサーバーコードにアクセスできない場合(おそらく何らかのWebサービス)サーバーでコードを変更すると作業が増えるため、クライアント側のコードを編集する方が簡単な場合はどうなりますか?gzippingによって意味のないようにレンダリングされる可能性がある数バイト以上のヘアを分割したり、文字列を分割するのに必要なミリ秒の1万分の1の意味はありません。
アンディE

4
ええと、mysqlは1つのタイムゾーンを使用し、javascriptのDateコンストラクターはローカルタイムゾーンしか受け入れないため、このソリューションを最大24時間まで間違ってレンダリングnew Date(Date.UTC(...))します。これが正解と見なされる前に考慮されます。
user3338098 2015

64

優れたアンディE回答に追加するには、一般的な使用法の関数は次のようになります。

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

このようにして、MySQLの日付/時刻の形式"YYYY-MM-DD HH:MM:SS"または短い形式(日付のみ)"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(...))他の方法で使用する必要があります。答えは最大24時間間違っています...
user3338098

30

私はもっ​​と簡単な方法を見つけたのではないかと思います。

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

お役に立てれば。


4
はい、効率的な簡単な方法です。しかし、私はUNIXタイムスタンプの乗算(* 1000)を(JavaScriptで)クライアントにプッシュします
Reinsbrain

16

最新のブラウザー(IE10 +)用の1つのライナー:

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
2番目の例(「古いブラウザーで機能するワンライナー」)は、1か月後の日付を示します。月のパラメーターはゼロから始まると思います。
nickyspag

@nickyspag残念!map()を使用して修正しましたが、もう簡潔ではありません。
aleemb 2015

優れた答え..彼らはすべて、特に最初の作業をしました
David Addoteye

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

3

マルコのソリューションにさらに追加します。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();

3

より簡単な方法として、SQLタイムスタンプ文字列があります。

2018-07-19 00:00:00

Date()が受け取るタイムスタンプに最も近い形式は次のとおりなので、 "T"の空白スペースを置き換えます。

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

「2011-10-10T14:48:00」

次に、日付オブジェクトを作成します。

var date = new Date(dateString);

結果は日付オブジェクトになります:

2018年7月19日(木)00:00:00 GMT-0300(オラリオパドランデブラジリア)


2

アンディの答えから、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に感謝します。これは、私がiOS用に構築した角度のあるアプリの壊れた日付を解決しました。
mediaguru 2017

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。(今、それをワンライナーに変えて変数を取り除くことができれば...)
T4NK3R 2014

1

最初に、YMD形式をコンポーネントに分割してこれらの日付コンポーネントを使用することにより、MySQLのYMD日付形式をJavaScript形式に変換するための新しいメソッド 'fromYMD()'をJavaScriptの日付オブジェクト(クラス)に与えることができます。

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の世界では機能):

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が秒を与えるためです。


-3

グーグルでのクイック検索はこれを提供しました:

 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


-4

なぜこれをしないのですか?

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

2
parseDateは、DateオブジェクトのJSメソッドではありません。最終的には静的解析メソッドがありますが、1つの引数しか受け入れません。
Marco Demaio、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.