JavaScriptで日付をフォーマットするためのドキュメントはどこにありますか?
私は、JavaScriptのnew Date()
関数がいくつかのフォーマットの日付を受け入れるのにとても賢いことに気付きました。
Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")
new Date()
functionの呼び出し中に、有効な文字列フォーマットすべてを示す文書がどこにも見つからなかった。
これは文字列を日付に変換するためのものです。反対側、つまり日付オブジェクトを文字列に変換する場合、JavaScriptには日付オブジェクトを文字列にフォーマットするAPIが組み込まれていないという印象を受けました。
編集者注: 以下のアプローチは、特定のブラウザでは機能しましたが、ではない一般的な機能です。 このページの答えを見てください 実際の解決策を見るため。
今日、私はdateオブジェクトに対してtoString()
メソッドを使ってプレイしましたが、驚くことにそれは日付を文字列にフォーマットするという目的にかなっています。
var d1 = new Date();
d1.toString('yyyy-MM-dd'); //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy') //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome
また、ここでは日付オブジェクトを文字列にフォーマットすることができるすべての方法に関するドキュメントを見つけることができませんでした。
Date()
オブジェクトでサポートされているフォーマット指定子をリストしたドキュメントはどこにありますか?
私はJavaScriptを使って時間と日付をフォーマットする10の方法が大好きですと日付の取り扱い.
基本的に、あなたは3つのメソッドを持ち、あなたはあなた自身のために文字列を組み合わせる必要があります:
getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year
例:
var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);
日付を解析、操作、およびフォーマットするための(軽量)* JavaScript日付ライブラリーです。
var a = moment([2010, 1, 14, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
a.format("ddd, hA"); // "Sun, 3PM"
(*)軽量を意味する9.3KBの最小化+可能な限り小さい設定での圧縮(feb 2014)
プロジェクトで既に jQuery UI を使用している場合は、日付オブジェクトのフォーマットに組み込みのdatepickerメソッドを使用できます。
$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));
ただし、日付ピッカーは日付のみをフォーマットし、時刻はフォーマットできません。
jQuery UI datepicker formatDate の例を見てください。
Date()
オブジェクトでサポートされている形式指定子をリストしたドキュメントはどこにありますか?
今日私はこれに出くわし、誰もこの簡単な質問に答えるのに時間をかけなかったことに非常に驚いた。確かに、日付の操作を支援するライブラリがたくさんあります。他のものよりも優れているものもあります。しかし、それは質問ではありませんでした。
私の知る限り、純粋なJavaScriptはフォーマット指定子をサポートしていません使用したいことを示した方法。ただし、.toLocaleDateString()
、.toLocaleTimeString()
、.toUTCString()
など、日付や時刻をフォーマットするメソッドはサポートしています。
私が最も頻繁に使用するDate
オブジェクト参照は w3schools.com Webサイト にあります(ただし 簡単なGoogle検索 により、ニーズに合ったものがさらに多く表示されます)。
また、Date Object Propertiesセクションは prototype
へのリンクを提供します。これは、カスタムメソッドでDateオブジェクトを拡張するいくつかの方法を示しています。 JavaScriptコミュニティでは、これがベストプラクティスであるかどうかについて長年にわたって いくつかの議論 がありましたが、その存在を指摘するだけで、賛成でも反対でもありません。
カスタムフォーマット機能:
固定フォーマットの場合は、単純な関数で機能します。次の例では、国際フォーマットYYYY-MM-DDを生成します。
function dateToYMD(date) {
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}
注意:ただし、通常はJavascript標準ライブラリを拡張することはお勧めできません(たとえば、この関数をDateのプロトタイプに追加するなどして)。
より高度な機能では、フォーマットパラメータに基づいて設定可能な出力を生成できます。この同じページに良い例がいくつかあります。
フォーマット関数を書くのが長すぎる場合は、その周りにたくさんのライブラリがあります。いくつかの他の答えはすでにそれらを列挙しています。しかし、依存関係が増えると、それも相反します。
標準のECMAScriptフォーマット関数
ECMAscriptの最近のバージョン以降、Date
クラスにはいくつかの特別なフォーマット関数があります。
toDateString :実装に依存し、日付のみを表示します。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring
new Date().toDateString(); // e.g. "Fri Nov 11 2016"
toISOString :ISO 8601の日付と時刻を表示します。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring
new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"
toJSON :JSONの文字列。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tojson
new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"
toLocaleDateString :実装に依存します。ロケール形式の日付です。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring
new Date().toLocaleDateString(); // e.g. "21/11/2016"
toLocaleString :実装に依存します。ロケール形式の日時です。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring
new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"
toLocaleTimeString :実装に依存します。ロケール形式の時間です。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring
new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"
toString :Dateに対する一般的なtoString。
http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring
new Date().toString(); // e.g. "Fri Nov 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"
注:これらのフォーマット設定関数からカスタム出力を生成することが可能です。
new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD
短い答え
JavaScriptが対応している「普遍的な」文書はありません。 JavaScriptを搭載したブラウザはすべて実際には実装です。しかし、最近のほとんどのブラウザが従う傾向がある規格があり、それがEMCAScript規格です。 ECMAScriptの標準文字列は、最低限、ISO 8601定義の修正された実装を取ります。
これに加えて、ブラウザが従う傾向がある _ ietf _ によって定められた第二の標準があります。これはRFC 2822で作られたタイムスタンプの定義です。実際の文書は参考文献リストにあります。下部にあります。
これから基本的な機能が期待できますが、本来あるべきことは本質的にそうではないということです。この質問には実際に回答したのは3人だけであるため(Scott、goofballLogic、およびpeller ie)、ほとんどの人はあなたが実際に何をしているのかわからないことを示唆しています。 Dateオブジェクトを作成します。
長い答え
Date()オブジェクトでサポートされているフォーマット指定子をリストしたドキュメントはどこにありますか?
質問に答える、あるいは通常この質問に対する答えを探すためには、Javascriptが新しい言語ではないことを知っておく必要があります。これは実際にはECMAScriptの実装であり、ECMAScript標準に従っています(ただし、JavaScriptも実際にはそれらの標準より前のものです。EMCAScript標準はLiveScript/JavaScriptの初期の実装から構築されています)現在のECMAScript規格は5.1(2011)です。質問が最初に出された時点(2009年6月)では、標準は3でした(4は放棄されました)が、2009年末の記事の直後に5がリリースされました。 a)特定の標準の実装であること、b)すべての標準の実装が純粋ではないこと、c)機能がaと同期してリリースされていないこと、 d)実装としての新しい標準は、進行中の一定の作業です。
基本的に、JavaScriptを扱うときは、実装(JavaScript自体)の派生物(ブラウザ固有のJavaScript)を扱っています。たとえば、GoogleのV8はECMAScript 5.0を実装していますが、Internet ExplorerのJScriptはECMAScript標準には準拠していませんが、Internet Explorer 9はECMAScript 5.0に準拠しています。
単一の引数がnew Date()に渡されると、この関数プロトタイプをキャストします。
new Date(value)
2つ以上の引数がnew Date()に渡されると、この関数プロトタイプをキャストします。
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
これらの機能はどちらもおなじみのはずですが、これはすぐにあなたの質問に答えるものではなく、許容できる「日付形式」として定量化するものについてはさらに説明が必要です。 new Date()に文字列を渡すと、プロトタイプが呼び出されます(私はWord prototypeを大まかに使用していることに注意してください。バージョンは個々の関数の場合もあれば、条件文の一部の場合もあります) new Date(value) に対して「value」パラメータの引数として文字列を指定します。この関数は最初にそれが数か文字列かをチェックします。この関数のドキュメントはここにあります。
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
これから、我々は、新しいDate(value)に許される文字列フォーマットを得るために、Date.parse(string)メソッドを見なければならないことを推測することができます。このメソッドのドキュメントはここにあります。
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
そして、ここで指定されているように、日付は修正されたISO 8601拡張フォーマットになると予想されることをさらに推論することができます。
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
しかし、javascriptのDateオブジェクトは他のフォーマット(最初にこの質問が存在することによって強制される)を受け入れることを経験から認識することができます。ECMAScriptが実装固有のフォーマットを可能にするのでこれは問題ありません。しかし、それでもまだ、利用可能な形式で利用可能な文書や、実際に許可されている形式についての質問には答えていません。 GoogleのJavaScript実装、V8を見ていきます。これが「最高の」JavaScriptエンジン(「最高の」、さらには「優れた」と定義する方法)であることをお勧めしているわけではありません。彼らが現代の期待に従っていると仮定するため。
GoogleのV8、date.js、DateConstructor
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
DateConstructor関数を見ると、DateParse関数を見つける必要があると推測できます。ただし、「year」は実際の年ではなく、「year」パラメータへの参照にすぎません。
GoogleのV8、date.js、DateParse
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
これは%DateParseStringを呼び出します。これは実際にはC++関数の実行時関数参照です。これは次のコードを参照します。
GoogleのV8、runtime.cc、%DateParseString
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
この関数で私たちが関心を持っている関数呼び出しはDateParser :: Parse()です。これらの関数呼び出しを囲むロジックを無視してください。これらはエンコーディングタイプ(ASCIIとUC16)に準拠するための単なるチェックです。 DateParser :: Parseは、ここで定義されています。
GoogleのV8、dateparser-inl.h、DateParser :: Parse
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
これは、実際に受け入れる形式を定義する関数です。基本的に、EMCAScript 5.0 ISO 8601規格をチェックし、規格に準拠していない場合は、従来の形式に基づいて日付を作成しようとします。コメントに基づくいくつかの重要なポイント:
- パーサーにとって未知の最初の数より前の単語は無視されます。
- かっこで囲まれたテキストは無視されます。
- 符号なしの数字とそれに続く「:」は、「時間の構成要素」として解釈されます。
- 符号なしの数字の後に「。」が続くと「時間の構成要素」と解釈され、その後にミリ秒が続く必要があります。
- 符号付き数字の後に時間または時分が続くもの(例:+ 5:15または+0515)はタイムゾーンとして解釈されます。
- 時分を宣言するときは、「hh:mm」または「hhmm」のどちらかを使用できます。
- タイムゾーンを示す単語はタイムゾーンとして解釈されます。
- 他のすべての数字は「日付コンポーネント」として解釈されます。
- 月の最初の3桁で始まる単語はすべて月と解釈されます。
- 「hh:mm」または「hhmm」の2つの形式のいずれかで、分と時間を一緒に定義できます。
- 数字が処理された後は、 "+"、 " - "、および一致しない ")"などの記号は使用できません。
- 複数のフォーマット(例:1970-01-01)に一致するアイテムは、標準準拠のEMCAScript 5.0 ISO 8601文字列として処理されます。
そのため、Dateオブジェクトに文字列を渡すときに何を期待するかについての基本的な考え方がわかります。 MozillaがMozilla Developer Network(IETF RFC 2822タイムスタンプに準拠している)で指摘している以下の仕様を見れば、これをさらに拡張できます。
Microsoft Developer Networkは、Dateオブジェクトの追加の標準、ECMA-402、ECMAScript国際化API仕様(ECMAScript 5.1標準(および将来のもの)を補完するもの)についても言及しています。それはここで見つけることができます:
いずれにせよ、これはjavascriptのすべての実装を普遍的に表す「文書化」がないことを強調するのに役立ちますが、どの文字列がDateオブジェクトに許容できるかを合理的に理解するのに十分な文書化はまだあります。あなたがそれについて考えるときかなりロードされた質問、はい? :P
参考文献
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
http://tools.ietf.org/html/rfc2822#page-14
http://www.ecma-international.org/ecma-402/1.0/ /
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
リソース
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
http://msdn.Microsoft.com/ja-jp/library/ff743760(v=vs.94).aspx
JavaScriptで日付を扱う場合は、必ず Datejs をチェックアウトしてください。 toString関数 の場合に見られるように、非常に印象的でよく文書化されています。
_ edit _ :Tyler Forsytheは、datejsが古くなっていることを指摘しています。私は私の現在のプロジェクトでそれを使用していて、それに関して何の問題もありませんでした、しかしあなたはこれを知っていて代替案を検討するべきです。
meizz で示されているように、Date
オブジェクトを新しいformat
メソッドで拡張することができます。以下は作者によって与えられたコードです。そしては jsfiddle です。
Date.prototype.format = function(format) //author: meizz
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
(this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)if(new RegExp("("+ k +")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length==1 ? o[k] :
("00"+ o[k]).substr((""+ o[k]).length));
return format;
}
alert(new Date().format("yyyy-MM-dd"));
alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));
あなたが引用する機能は標準的なJavascriptではなく、ブラウザ間で移植性があるとは思われないので、あまり良い方法ではありません。 ECMAScript 3 spec は、解析および出力フォーマット機能をJavascript実装に任せます。 ECMAScript 5 はISO 8601サポートのサブセットを追加します。あなたが言及したtoString()関数は一つのブラウザの革新であると私は信じています(Mozilla?)
いくつかのライブラリはこれをパラメータ化するためのルーチンを提供します。 dojo.date.locale にあるメソッドをチェックすることもできます。
私はこの非常に単純なフォーマッタを作りました、それはcut/n/pastableです(より新しいバージョンで更新されます):
function DateFmt(fstr) {
this.formatString = fstr
var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
var zeroPad = function(number) {
return ("0"+number).substr(-2,2);
}
var dateMarkers = {
d:['getDate',function(v) { return zeroPad(v)}],
m:['getMonth',function(v) { return zeroPad(v+1)}],
n:['getMonth',function(v) { return mthNames[v]; }],
w:['getDay',function(v) { return dayNames[v]; }],
y:['getFullYear'],
H:['getHours',function(v) { return zeroPad(v)}],
M:['getMinutes',function(v) { return zeroPad(v)}],
S:['getSeconds',function(v) { return zeroPad(v)}],
i:['toISOString']
};
this.format = function(date) {
var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {
var rv = date[(dateMarkers[p])[0]]()
if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)
return rv
});
return dateTxt
}
}
fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S %i")
v = fmt.format(new Date())
フレームワークフリー、限られているが軽量
var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]
[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"
DateJSは確かにフル機能ですが、私は この非常に単純なlib(JavaScript Date Format)をお勧めします これは120行程度しかないという理由で私が好きです。
他の回答で提供されている選択肢のいくつかを見てきたので、私は自分だけの限定的で単純な解決策を書くことにしました。
/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
// Calculate date parts and replace instances in format string accordingly
format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
format = format.replace("YYYY", date.getFullYear());
return format;
}
使用例
console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));
これは私がよく使う関数です。結果はyyyy-mm-dd hh:mm:ss.nnnです。
function date_and_time() {
var date = new Date();
//zero-pad a single zero if needed
var zp = function (val){
return (val <= 9 ? '0' + val : '' + val);
}
//zero-pad up to two zeroes if needed
var zp2 = function(val){
return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;
}
var d = date.getDate();
var m = date.getMonth() + 1;
var y = date.getFullYear();
var h = date.getHours();
var min = date.getMinutes();
var s = date.getSeconds();
var ms = date.getMilliseconds();
return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}
他のどのライブラリよりも小さく、さまざまな形式をサポートするように簡単に拡張可能な、dateオブジェクトのこの変更が便利な場合があります。
注:
- これは Object.keys() を使用します。これは古いブラウザでは未定義なので、与えられたリンクからpolyfillを実装する必要があるかもしれません。
_ code _
Date.prototype.format = function(format) {
// set default format if function argument not provided
format = format || 'YYYY-MM-DD hh:mm';
var zeropad = function(number, length) {
number = number.toString();
length = length || 2;
while(number.length < length)
number = '0' + number;
return number;
},
// here you can define your formats
formats = {
YYYY: this.getFullYear(),
MM: zeropad(this.getMonth() + 1),
DD: zeropad(this.getDate()),
hh: zeropad(this.getHours()),
mm: zeropad(this.getMinutes())
},
pattern = '(' + Object.keys(formats).join(')|(') + ')';
return format.replace(new RegExp(pattern, 'g'), function(match) {
return formats[match];
});
};
_ use _
var now = new Date;
console.log(now.format());
// outputs: 2015-02-09 11:47
var yesterday = new Date('2015-02-08');
console.log(yesterday.format('hh:mm YYYY/MM/DD'));
// outputs: 00:00 2015/02/08
Gongzhitaaoのしっかりした答えを続けるために - これはAM/PMを扱います
Date.prototype.format = function (format) //author: meizz
{
var hours = this.getHours();
var ttime = "AM";
if(format.indexOf("t") > -1 && hours > 12)
{
hours = hours - 12;
ttime = "PM";
}
var o = {
"M+": this.getMonth() + 1, //month
"d+": this.getDate(), //day
"h+": hours, //hour
"m+": this.getMinutes(), //minute
"s+": this.getSeconds(), //second
"q+": Math.floor((this.getMonth() + 3) / 3), //quarter
"S": this.getMilliseconds(), //millisecond,
"t+": ttime
}
if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
(this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length == 1 ? o[k] :
("00" + o[k]).substr(("" + o[k]).length));
return format;
}
有効な日付フォーマットに関する明確な文書を見つけることができなかったので、さまざまなブラウザで何がサポートされているかを確認するために私自身のテストを書きました。
http://blarg.co.uk/blog/javascript-date-formats
私の結果は、私がテストしたすべてのブラウザで次のフォーマットが有効であると結論付けました(例は日付 "2013年8月9日"を使用します):
[通年]/[月]/[日付番号] - 月は、先行ゼロの有無にかかわらず番号、または短い形式または長い形式の月の名前で、日付番号は、なしまたはなしのいずれかです。先行ゼロ.
- 2013/08/09
- 2013/08/9
- 2013/8/09
- 2013年8月9日
- 2013年/ 8月/ 09
- 2013年/ 8月/ 9日
- 2013/08/09
- 2013年8月9日
[月]/[通年]/[日付番号] - 月は、先行ゼロの有無にかかわらず番号、または短い形式または長い形式の月の名前で、日付番号は、なしまたはなしのいずれかです。先行ゼロ
- 08/2013/09
- 08/2013/9
- 8/2013/09
- 8/2013/9
- 2013年8月/ 09年
- 2013年8月/ 9日
- 2013年8月/ 09
- 2013年8月/ 9日
スペースで区切られた[Full Year]、[Month Name]、および[Date Number]の任意の組み合わせ - 月の名前は、短い形式または長い形式のいずれでもかまいません。
- 2013年8月9日
- 2013年8月9日
- 2013年8月9日
- 2013年8月9日
- 2013年8月9日
- 2013年8月9日
- 等...
「最近のブラウザ」(つまりIE9以下を除くすべてのブラウザ)でも有効です。
[通年] - [月番号] - [日付番号] - 月と日付番号には先行ゼロを含める必要があります(これは MySQL日付タイプ が使用する形式です)。
- 2013-08-09
月名を使用する:
興味深いことに、月名を使うとき、月名の最初の3文字だけが使われることがわかったので、以下のすべてが完全に有効です。
new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');
ライブラリ sugar.js には、JavaScriptで日付を処理するための優れた機能がいくつかあります。そしてそれは非常にうまくいっています ドキュメント - 。
"1時間前"のような相対的なフォーマットを含む15の主要な言語のほぼすべてのフォーマットで日付を理解できるDate.create メソッドから始めて、SugarはDateクラスを非常に気に入っています。日付は、よく使用される日付形式へのショートカットを使用して、わかりやすい構文を使用して任意の形式または言語で出力することもできます。 is []のような方法で複雑な日付比較も可能です。これは任意の形式を理解し、組み込み精度を適用します。
いくつかの例:
Date.create('July 4, 1776') -> July 4, 1776
Date.create(-446806800000) -> November 5, 1955
Date.create(1776, 6, 4) -> July 4, 1776
Date.create('1776年07月04日', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en') -> July 4, 1776
Date.create().format('{Weekday} {d} {Month}, {yyyy}') -> Monday July 4, 2003
Date.create().format('{hh}:{mm}') -> 15:57
Date.create().format('{12hr}:{mm}{tt}') -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME) -> 2011-07-05 12:24:55.528Z
Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"
JavaScriptでの日付の書式設定、特に構文解析は少々頭痛の種です。すべてのブラウザが日付を同じ方法で処理するわけではありません。そのため、基本メソッドを知っておくと便利ですが、ヘルパーライブラリを使用する方が実用的です。
XDate javascriptライブラリ by Adam Shaw は2011年中頃から使用されており、まだ活発に開発中です。それは素晴らしいドキュメンテーション、素晴らしいAPI、フォーマットを持ち、後方互換性を保とうとし、さらにローカライズされた文字列をサポートします。
ロケール文字列の変更へのリンク: https://Gist.github.com/1221376
コード例:
var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");
出力:
"13時45分20秒"
すべてのブラウザ
あなたが使用しているソースフォーマットで日付をフォーマットする最も信頼できる方法は、以下のステップを適用することです:
new Date()
を使用してDate
オブジェクトを作成する.getDate()
、.getMonth()
および.getFullYear()
を使用して、それぞれ日、月、年を取得します。- 目的のフォーマットに従ってピースを貼り付ける
例:
var date = '2015-11-09T10:46:15.097Z';
function format(input) {
var date = new Date(input);
return [
("0" + date.getDate()).slice(-2),
("0" + (date.getMonth()+1)).slice(-2),
date.getFullYear()
].join('/');
}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015
( this Fiddle も参照)。
最近のブラウザのみ
組込みの.toLocaleDateString
メソッドを使ってフォーマットすることもできます。正しいフォーマットに合わせるには、適切なロケールとオプションを渡す必要があります。残念ながら、これは最新のブラウザでのみサポートされています (*) :
var date = '2015-11-09T10:46:15.097Z';
function format(input) {
return new Date(input).toLocaleDateString('en-GB', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
}
document.body.innerHTML = format(date); // OUTPUT : 09/11/2015
( this Fiddle も参照)。
(*) MDN によると、 "Modern browsers"はChrome 24以降、Firefox 29以降、IE 11、Edge 12以降、Opera 15以降、およびSafariを意味します ナイトリービルド
私が書いた別の選択肢
それが役立つかどうかわからないが、私はそれがいくつかのプロジェクトで役に立つことがわかった - それはあなたが必要とすることをするだろうように見える。
日付/時刻のフォーマット、日付の計算(日付部分の追加/減算)、日付の比較、日付の解析などをサポートしています。
すでにフレームワークを使用している(それらはすべて機能している)場合に考慮する理由はありませんが、プロジェクトに日付操作をすばやく追加する必要がある場合は、チャンスを与えてください。
この機能を使う
toTimeString() and toLocaleDateString()
詳細については、下記のリンクを参照してください https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
2 数字で時間だけを表示したい場合は、これが役立ちます。
var now = new Date();
var cHour = now.getHours();
var cMinuts = now.getMinutes();
var cSeconds = now.getSeconds();
var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);
"2012-12-29"を返すように日付をフォーマットする正しい方法は、からのスクリプトを使用することです。 - JavaScript日付フォーマット:
var d1 = new Date();
return d1.format("dd-m-yy");
このコードは機能しません。
var d1 = new Date();
d1.toString('yyyy-MM-dd');
JsSimpleDateFormat は、dateオブジェクトをフォーマットし、フォーマットされた文字列をDateオブジェクトに解析することができるライブラリです。 Javaフォーマット(SimpleDateFormatクラス)を使用しています。月と日の名前はローカライズすることができます。
例:
var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");
日付のフォーマットは独自の機能なので、答えは「どこにもありません」です。 toString関数が特定のフォーマットに準拠することを意図しているとは思いません。例えばECMAScript 5.1仕様( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 、2/8/2013、page 173)で、 toString functionは次のように文書化されています。
"Stringの内容は実装依存です"
以下のサンプルのような機能は、かなり簡単にフォーマットを達成するために使用することができます。
function pad(toPad, padWith) {
return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}
function dateAsInputValue(toFormat) {
if(!(toFormat instanceof Date)) return null;
return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}
function timeAsInputValue(toFormat) {
if(!(toFormat instanceof Date)) return null;
return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}
Moment.js のようなライブラリが提供するすべての機能を必要としないのであれば、 strftime の私の移植版を使うことができます。それは軽量(Moment.js 2.15.0と比較して1.35 KB対57.9 KB縮小)で、strftime()
のほとんどの機能を提供します。
/* Port of strftime(). Compatibility notes:
*
* %c - formatted string is slightly different
* %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
* %e - space is not added
* %E - not implemented
* %h - not implemented (use "%b")
* %k - space is not added
* %n - not implemented (use "\n")
* %O - not implemented
* %r - not implemented (use "%I:%M:%S %p")
* %R - not implemented (use "%H:%M")
* %t - not implemented (use "\t")
* %T - not implemented (use "%H:%M:%S")
* %U - not implemented
* %W - not implemented
* %+ - not implemented
* %% - not implemented (use "%")
*
* strftime() reference:
* http://man7.org/linux/man-pages/man3/strftime.3.html
*
* Day of year (%j) code based on Joe Orost's answer:
* http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
*
* Week number (%V) code based on Taco van den Broek's prototype:
* http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
*/
function strftime(sFormat, date) {
if (!(date instanceof Date)) date = new Date();
var nDay = date.getDay(),
nDate = date.getDate(),
nMonth = date.getMonth(),
nYear = date.getFullYear(),
nHour = date.getHours(),
aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
isLeapYear = function() {
if (nYear&3!==0) return false;
return nYear%100!==0 || year%400===0;
},
getThursday = function() {
var target = new Date(date);
target.setDate(nDate - ((nDay+6)%7) + 3);
return target;
},
zeroPad = function(nNum, nPad) {
return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
};
return sFormat.replace(/%[a-z]/gi, function(sMatch) {
return {
'%a': aDays[nDay].slice(0,3),
'%A': aDays[nDay],
'%b': aMonths[nMonth].slice(0,3),
'%B': aMonths[nMonth],
'%c': date.toUTCString(),
'%C': Math.floor(nYear/100),
'%d': zeroPad(nDate, 2),
'%e': nDate,
'%F': date.toISOString().slice(0,10),
'%G': getThursday().getFullYear(),
'%g': ('' + getThursday().getFullYear()).slice(2),
'%H': zeroPad(nHour, 2),
'%I': zeroPad((nHour+11)%12 + 1, 2),
'%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
'%k': '' + nHour,
'%l': (nHour+11)%12 + 1,
'%m': zeroPad(nMonth + 1, 2),
'%M': zeroPad(date.getMinutes(), 2),
'%p': (nHour<12) ? 'AM' : 'PM',
'%P': (nHour<12) ? 'am' : 'pm',
'%s': Math.round(date.getTime()/1000),
'%S': zeroPad(date.getSeconds(), 2),
'%u': nDay || 7,
'%V': (function() {
var target = getThursday(),
n1stThu = target.valueOf();
target.setMonth(0, 1);
var nJan1 = target.getDay();
if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
})(),
'%w': '' + nDay,
'%x': date.toLocaleDateString(),
'%X': date.toLocaleTimeString(),
'%y': ('' + nYear).slice(2),
'%Y': nYear,
'%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
'%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
}[sMatch] || sMatch;
});
}
使用例:
strftime('%F'); // Returns "2016-09-15"
strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"
// You can optionally pass it a Date object...
strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"
最新のコードはこちらから入手できます。 https://github.com/thdoan/strftime
個人的には、PHPとjQuery/javascriptの両方を同じように使っているので、php.js http://phpjs.org/functions/date/ のdate関数を使います
私がすでに知っているものと同じフォーマット文字列を使用するライブラリを使用するのは私にとってはより簡単であり、日付関数のためのすべてのフォーマット文字列の可能性を含むマニュアルはもちろんphp.netでオンラインです。
好みの方法でdate.jsファイルをHTMLにインクルードしてから、次のように呼び出します。
var d1=new Date();
var datestring = date('Y-m-d', d1.valueOf()/1000);
必要に応じて、valueOf()の代わりにd1.getTime()を使用できます。それらは同じことを行います。
Javascriptのタイムスタンプを1000で割るのは、javascriptのタイムスタンプはミリ秒単位ですが、PHPタイムスタンプは秒単位です。
この質問に対する具体的な答えは、以下の2行にあります。
//pull the last two digits of the year
console.log(new Date().getFullYear().toString().substr(2,2));
日付/時刻のフォーマットの例(MMddyy): jsFiddle
JavaScript:
//A function for formatting a date to MMddyy
function formatDate(d)
{
//get the month
var month = d.getMonth();
//get the day
var day = d.getDate();
//get the year
var year = d.getFullYear();
//pull the last two digits of the year
year = year.toString().substr(2,2);
//increment month by 1 since it is 0 indexed
month = month + 1;
//converts month to a string
month = month + "";
//if month is 1-9 pad right with a 0 for two digits
if (month.length == 1)
{
month = "0" + month;
}
//convert day to string
day = day + "";
//if day is between 1-9 pad right with a 0 for two digits
if (day.length == 1)
{
day = "0" + day;
}
//return the string "MMddyy"
return month + day + year;
}
var d = new Date();
console.log(formatDate(d));
d = Date.now();
d = new Date(d);
d = (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear()+' '+(d.getHours() > 12 ? d.getHours() - 12 : d.getHours())+':'+d.getMinutes()+' '+(d.getHours() >= 12 ? "PM" : "AM");
console.log(d);
(あなたが既に使っているかもしれない)多くのフレームワークはあなたが気付いていないかもしれない日付フォーマットを持っています。 jQueryUIはすでに言及されていますが、 Kendo UI(Globalization) 、 Yahoo UI(Util) 、および AngularJS などの他のフレームワークにもあります。
// 11/6/2000
kendo.toString(new Date(value), "d")
// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
dtmFRM.js を参照してください。 C#のカスタムの日付と時刻のフォーマット文字列に慣れている場合は、このライブラリでもまったく同じことができます。
デモ :
var format = new dtmFRM();
var now = new Date().getTime();
$('#s2').append(format.ToString(now,"This month is : MMMM") + "</br>");
$('#s2').append(format.ToString(now,"Year is : y or yyyy or yy") + "</br>");
$('#s2').append(format.ToString(now,"mm/yyyy/dd") + "</br>");
$('#s2').append(format.ToString(now,"dddd, MM yyyy ") + "</br>");
$('#s2').append(format.ToString(now,"Time is : hh:mm:ss ampm") + "</br>");
$('#s2').append(format.ToString(now,"HH:mm") + "</br>");
$('#s2').append(format.ToString(now,"[ddd,MMM,d,dddd]") + "</br></br>");
now = '11/11/2011 10:15:12' ;
$('#s2').append(format.ToString(now,"MM/dd/yyyy hh:mm:ss ampm") + "</br></br>");
now = '40/23/2012'
$('#s2').append(format.ToString(now,"Year is : y or yyyy or yy") + "</br></br>");