JavaScriptでDateオブジェクトから文字列を生成したり、逆に文字列からDateオブジェクトを作ったりすることが多いので、ノウハウとサンプルソースをまとめました。
どのような形でフォーマットするのが良いか迷うことも多いですもんね。
Date -> String(日付 -> 文字列)へ変換する
Dateオブジェクトから文字列を生成するには、以下のように、それぞれ年、月、日などを取得して、そこから文字列を組み立てる方法が確実です。(理由は後述。)
早速、コードを載せます。
Date型から「YYYY-MM-DD hh:mm:ss」形式に変換するサンプルです。
var date = new Date();
var rtn_str = getStringFromDate(date);
console.log(rtn_str);
//日付から文字列に変換する関数
function getStringFromDate(date) {
var year_str = date.getFullYear();
//月だけ+1すること
var month_str = 1 + date.getMonth();
var day_str = date.getDate();
var hour_str = date.getHours();
var minute_str = date.getMinutes();
var second_str = date.getSeconds();
format_str = 'YYYY-MM-DD hh:mm:ss';
format_str = format_str.replace(/YYYY/g, year_str);
format_str = format_str.replace(/MM/g, month_str);
format_str = format_str.replace(/DD/g, day_str);
format_str = format_str.replace(/hh/g, hour_str);
format_str = format_str.replace(/mm/g, minute_str);
format_str = format_str.replace(/ss/g, second_str);
return format_str;
};
実行結果
2019-9-26 14:11:2
解説
getXXX()で年、月、日などが取得できますので、それぞれの値を取得して、最後に
format_str = ‘YYYY-MM-DD hh:mm:ss’;
に対してreplaceすることで指定したフォーマットの形式にしています。
なので、
format_str = ‘YYYYMMDD’;
に変更すると、「YYYYMMDD」形式になりますね。
注意点としては、月のみ、
var month_str = 1 + date.getMonth();
のように「+1」する必要があります。
なぜかというと、date.getDate()だけ、1月なら0が、2月なら1が返却されるからです。
また、getXXX()では数字が返却されるので、「2019-9-26」ではなく「2019-09-26」のように0埋めをしたい場合は、以下のようにします。
日の部分を例にとると、
day_str = (‘0’ + day_str).slice(-2);
のように、返却された数字に0をつけて、後ろから2文字を取得しています。
つまり、
9が返却された場合「09」のようになり、後ろから2文字なので「09」になります。
一方、二けたの数字11が返却された場合「011」のようになり、後ろから2文字なので「11」になります。
//日付から文字列に変換する関数
function getStringFromDate(date) {
var year_str = date.getFullYear();
//月だけ+1すること
var month_str = 1 + date.getMonth();
var day_str = date.getDate();
var hour_str = date.getHours();
var minute_str = date.getMinutes();
var second_str = date.getSeconds();
month_str = ('0' + month_str).slice(-2);
day_str = ('0' + day_str).slice(-2);
hour_str = ('0' + hour_str).slice(-2);
minute_str = ('0' + minute_str).slice(-2);
second_str = ('0' + second_str).slice(-2);
format_str = 'YYYY-MM-DD hh:mm:ss';
format_str = format_str.replace(/YYYY/g, year_str);
format_str = format_str.replace(/MM/g, month_str);
format_str = format_str.replace(/DD/g, day_str);
format_str = format_str.replace(/hh/g, hour_str);
format_str = format_str.replace(/mm/g, minute_str);
format_str = format_str.replace(/ss/g, second_str);
return format_str;
};
実行結果
2019-09-26 14:06:28
上記では、汎用的な関数にするためにフォーマットをreplaceする形式にしていますが、原理が分かればもう少しシンプルに記述することもできます。
例えば、現在日付をYYYY/MM/DD形式の文字列で取得するには
function getNowDateWithString(){
var dt = new Date();
var y = dt.getFullYear();
var m = ("00" + (dt.getMonth()+1)).slice(-2);
var d = ("00" + dt.getDate()).slice(-2);
var result = y + "/" + m + "/" + d;
return result;
}
のように記述できます。
String -> Date(文字列 -> 日付)への変換
日時を表現した文字列からDate型のオブジェクトを生成するには、Date型オブジェクトのコンストラクタを使う方法とDate.parse()を使う方法があります。
コンストラクタは、以下の形式で指定します。
new Date( year, month, day [, hour, minute, second, millisecond] )
例えば、
var date = new Date("2019", "09", "26", "11", "01", "22");
console.log(date.toString());
のように使います。
var datestr = "2019/09/26 11:01:22";
var date = Date.parse(datestr);
console.log(date.toString());
parseに上記のような文字列を渡すと、Date型を生成してくれます。
なお、Date.parse() メソッドは、日時を表す文字列を解釈して、協定世界時 (UTC) 1970年1月1日00:00:00からの経過ミリ秒を返す関数なので、Date型の中身は、1970/1/1 00:00:00からの経過ミリ秒になります。
また、文字列を解釈できなかったり不正な日付 (例えば 2019-02-31) が指定された場合には NaN を返します。
渡す文字列のフォーマットは上記の他に
var datestr = “2019-09-26 11:01:22”;
var datestr = “2019-09-26T11:01:22”;
var datestr = “2019-09-26T11:01:22+09:00”;
なども渡すことができますが、ブラウザによってparseできる形式とできない形式が混在します。
また、”2019-09-26 11:01:22″というハイフンの形式だとPCのChrome、Edge、IE11ではマシンのタイムゾーンを見て判断するので日本時間となりますが、モバイルのSafariだと標準時で取得され9時間のずれが発生するので、“2019-09-26T11:01:22+09:00”のように時差をつけて指定するか、“2019/09/26 11:01:22”のようにスラッシュ(/)形式で指定するのがよさそう。
もしくは、素直に、コンストラクタの形式で、年、月、日等を別々に分けて渡すといいですね。