JavaScriptでの日付のフォーマットに関するドキュメントはどこにありますか?[閉まっている]


1398

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()関数を呼び出しているときに、すべての有効な文字列形式を示すドキュメントをどこにも見つけることができませんでした。

これは文字列を日付に変換するためのものです。反対側、つまり日付オブジェクトを文字列に変換すると、今までJavaScriptには日付オブジェクトを文字列にフォーマットする組み込みのAPIがないという印象を受けました。

編集者注:次のアプローチは、特定のブラウザでは機能したが一般には機能しない質問者の試みです。このページの回答を見て、実際の解決策をいくつか見てください。

今日、私は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()オブジェクトでサポートされているフォーマット指定子をリストしたドキュメントはどこにありますか?


165
あなたの例は実際にあなたが思っているように動作しません:jsfiddle.net/edelman/WDNVk/1
Jason

27
申し訳ありませんが、toStringでフォーマット文字列を渡すことは.NETで機能し、Javaでも機能する可能性がありますが、Jasonが指摘したように、これは実際にはJavaScriptでは機能しません。
Joshua Carmody、2011年

12
人々は覚えている-質問は、どんなに標準的であっても、質問のままでいる必要がある。この質問を回答に変える編集は控え、代わりに回答を修正して維持してください。ありがとう:)
Tim Post

1
このリンクのコードを使用しましたmsdn.microsoft.com/en-us/library/ie/ff743760 (v=vs.94).aspx-(date.toLocaleDateString( "en-US"));
Khaled Annajar 2014年

このページへの今後の訪問者がほとんどの回答が質問にどのように関連しているか混乱している場合は、質問のリビジョン、特に(上記と異なる場合)リビジョン15 @ Eric Muyserを読むことをお勧めしますDate#toStringの使用法。
user66001 2015年

回答:


1063

私は愛する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);


27
これらの両方のサイトには、制限付きのライセンスがあります。そのため、コードを(許可なしに)使用すると、違反になります。Momentjs(stackoverflow.com/a/10119138/278976)は、より優れたオプションのように見え、MITライセンスです。
Homer6、2012年

4
@pellerこの回答は、「JavaScriptで日付をフォーマットする方法を教えてください」という質問に答えます。これは事実上質問のタイトルです。質問の本文では、彼はかなり誤解を招きます。そして、あなたのポイントには、この答えはランダムな非標準または言及されていないライブラリを使用した文字列のフォーマットについては触れていません。しかし、質問の#1コメントが指摘しているように、質問のその部分は誤って尋ねられました。したがって、これは本当の質問に答えますが、実際には存在しないフォーマット文字列には答えません。
マッケイ

3
@McKay; それは問題ではありませんでした。私はあなたがペラーが何を求めているのか誤解している、またはあなたの推論において鈍感であると思います。
codeinthehole 2012

10
@codeinthehole「JavaScriptで日付をフォーマットする」が問題です。「今まで、JavaScriptには日付オブジェクトを文字列にフォーマットするための組み込みのAPIがないという印象を受けました。」しかし、それから彼がJavaScriptでネイティブであると彼が考えると思う行動について話します。彼が誤って参照しているライブラリーがわからないので、彼は「JavaScriptで日付をフォーマットするにはどうすればよいですか?」とんでもない飛躍をしているとは思いません。
マッケイ

5
MMは1-12ではなく01-12を意味します:2013-04-17 => OK 2013-4-17 => BAD
Adrian Maire

678

Moment.js

これは、日付を解析、操作、およびフォーマットするための(軽量)* 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の縮小+可能な最小のセットアップでgzip圧縮したことを意味します(2014年2月)


7
これは、コアオブジェクトをモンキーパンチする代わりに、Dateオブジェクトの周りにデコレータパターンを提供するため、将来的に競合が発生する可能性が低くなります。
Gabe Martin-Dempesy

120
「軽量」という言葉の悪用をやめてください。5kbでさえ、そのような機能に対して途方もなく大きいです、そして今日、そのサイズは19kbに増加しました。
user123444555621 2013

27
@ Pumbaa80私は「そのような機能のために5kbでも途方もなく大きい」には同意しません。ドキュメントを見ましたか?JSで日付を処理するための非常に便利なライブラリです。「D / M / Y」のような基本的なフォーマットを1回使用するだけの場合、ライブラリが数KBを超えることは少しやり過ぎになる可能性があることを理解しています。 。保守可能なコードは、数KBのために良いものです。+ 100KBに縮小された場合、私は同意します。
Turnerj

15
@Tumerjは、それが有用であると主張して、軽量であることの懸念に対処することはありません。2つは関連していません。
JoshJordan 2014年

9
エンジンを取り外すと、ジェット機ではなくグライダーになるため、ジェット機をより軽量にすることはできません。軽量とは、特定の機能を実行するために必要な機能のみを備えていることを意味します。エルゴ、これは軽量のソリューションです。
Bon

425

プロジェクトですでにjQuery UIを使用している場合は、組み込みのdatepickerメソッドを使用して日付オブジェクトをフォーマットできます。

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

ただし、datepickerは日付のみをフォーマットし、時刻はフォーマットできません。

見ていjQueryのUI DatePickerのは、FormatDate、例。


現地時間またはズールー語を使用するように指示する方法は?
Ustaman Sangat

7
ライブラリなしで時間を取得できるこのソリューションを使用することをお勧めします:new Date()。toTimeString()。match(/ ^([0-9] {2}:[0-9] {2}:[0-9 ] {2})/)[0] FYI
markcial 2012年

これを行う方法はありますか?$ .datepicker.formatDate( 'yy-mm-dd'、new Date( "txtAdvDate" .Val());またはそのようなもの
Pomster

@Pomster-「txtAdvDate」という文字列にvalメソッドが含まれていると思うのはなぜですか。$( '#txtAdvDate')。val()ですか?それがコンストラクターの1つ(ここでw3schools.com/jsref/jsref_obj_date.aspを参照)に適合すると仮定すると、それはうまく機能します。
vbullinger 2012

@Pomster-これを使用してみてください:document.getElementById(id).value = $ .datepicker.formatDate( 'yy-mm-dd'、new Date());
mrrsb

219

Date()オブジェクトでサポートされているフォーマット指定子をリストしたドキュメントはどこにありますか?

今日私はこれを偶然見つけましたが、誰もこの単純な質問に答えるのに時間をかけなかったことに非常に驚きました。確かに、日付の操作に役立つライブラリはたくさんあります。いくつかは他よりも優れています。しかし、それは尋ねられた質問ではありませんでした。

申し訳ありませんが、純粋なJavaScriptは、指定し形式指定子を、使用したい方法でサポートしていません。しかし、それは、次のような書式設定、日付/時刻のサポート方法を、ない.toLocaleDateString().toLocaleTimeString().toUTCString()

Date私が最も頻繁に使用するオブジェクト参照は、w3schools.comのWebサイトにあります(ただし、Googleをすばやく検索すると、ニーズに合う可能性のある多くのオブジェクトが明らかになります)。

また、Dateオブジェクトのプロパティセクションにはへのリンクがありprototype、カスタムメソッドを使用してDateオブジェクトを拡張するいくつかの方法を示しています。これがベストプラクティスであるかどうかについて、JavaScriptコミュニティでは長年にわたっていくつかの議論があり、私はその存在を指摘するだけで、それについて賛成したり反対したりしていません。



2
私の回答もこの質問に対処しようとしました。私は、FirefoxまたはMozillaブラウザが、そのようなフォーマット文字列をとるDate.toString()メソッドをかつて提供していたと思います。残念ながら、古いドキュメントの痕跡は見つかりません。それはもはや標準の一部ではなく、Firefoxでさえ、もはやどこでもサポートされていないようです。
ペラー2013年

214

カスタムフォーマット機能:

固定フォーマットの場合、単純な関数が機能します。次の例では、国際形式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:日付の一般的な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

10
必要な形式(1-1-2000ではなく01-01-2000)を提供するため、これは受け入れられるべき答えです
ダヌビアンセーラー

6
new Date()。toISOString()。slice(0,10)// "2015-04-27"
image72

2
9月11日の例がないと非常に役立つので、どの位置で日と月が表されているかが明確になります。
Karl Adler

1
@abimelex完了。それが今より明確になることを願っています。
エイドリアンメア2017

1
ソースへのリンクを追加していただきありがとうございます(:-developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…およびdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference
サンドラ

125

短い答え

JavaScriptが対応する「ユニバーサル」ドキュメントはありません。JavaScriptを備えたすべてのブラウザは、実際に実装されています。ただし、最近のほとんどのブラウザーが従う傾向がある標準があり、それがEMCAScript標準です。ECMAScript標準文字列は、ISO 8601定義の変更された実装を最低限必要とします。

これに加えて、IETFによって設定された2番目の標準があります。、ブラウザーが同様に追跡する傾向があるがあります。これは、RFC 2822で作成されたタイムスタンプの定義です。実際のドキュメントは、下部の参照リストにあります。

このことから、基本的な機能を期待できますが、本来あるべき「本来あるべきもの」ではありません。私はこれを手続き的に少し詳しく説明しますが、実際に質問に答えたのは3人(Scott、goofballLogic、およびpeller)だけなので、ほとんどの人はあなたが実際に何が起こっているのか気づいていないようですDateオブジェクトを作成します。


長い答え

Date()オブジェクトでサポートされているフォーマット指定子をリストしたドキュメントはどこにありますか?


質問に答えたり、通常はこの質問への答えを探したりするには、JavaScriptが新しい言語ではないことを知っておく必要があります。これは実際にはECMAScriptの実装であり、ECMAScript標準に従います(ただし、JavaScriptは実際にはこれらの標準よりも古いものです。EMCAScript標準は、LiveScript / JavaScriptの初期の実装に基づいて構築されています)。現在のECMAScript標準は5.1(2011)です。質問が最初に行われたとき(2009年6月)、標準は3(4は放棄されました)でしたが、2009年末の投稿の直後に5がリリースされました。JavaScriptの実装が従う可能性のある標準、実際に何が行われているのかを反映していない可能性があります。これは、a)特定の標準の実装であるため、b)標準のすべての実装が純粋ではないためです。

基本的に、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()に渡すと、プロトタイプが呼び出されます(私はプロトタイプという単語を大まかに使用していることに注意してください。バージョンは個々の関数である場合もあれば、単一の関数の条件ステートメントの一部である場合もあります)。「値」パラメータの引数として文字列を使用した新しい日付(値)。この関数は、最初にそれが数値か文字列かをチェックします。この関数のドキュメントはここにあります:

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関数を見つける必要があると推測できます。ただし、「年」は実際の年ではなく、「年」パラメータへの参照にすぎないことに注意してください。

GoogleのV8、date.js、DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

これは、実際にはC ++関数の実行時関数参照である%DateParseStringを呼び出します。次のコードを参照します。

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標準をチェックし、標準に準拠していない場合は、レガシー形式に基づいて日付を作成しようとします。コメントに基づくいくつかの重要なポイント:

  1. パーサーにとって未知の最初の数より前の単語は無視されます。
  2. 括弧で囲まれたテキストは無視されます。
  3. 「:」が後に続く符号なしの数値は、「時間コンポーネント」として解釈されます。
  4. 符号なしの数字の後に「。」「時間コンポーネント」として解釈され、その後にミリ秒が続く必要があります。
  5. 時間または分が続く符号付きの数値(例:+5:15または+0515)はタイムゾーンとして解釈されます。
  6. 時間と分を宣言するときは、「hh:mm」または「hhmm」のいずれかを使用できます。
  7. タイムゾーンを示す単語は、タイムゾーンとして解釈されます。
  8. 他のすべての数値は「日付コンポーネント」として解釈されます。
  9. 月の最初の3桁で始まるすべての単語は、月として解釈されます。
  10. 「hh:mm」または「hhmm」の2つの形式のいずれかで分と時間を一緒に定義できます。
  11. 「+」、「-」、一致しない「)」などの記号は、数値が処理された後は許可されません。
  12. 複数の形式(1970-01-01など)に一致するアイテムは、標準に準拠したEMCAScript 5.0 ISO 8601文字列として処理されます。

したがって、これは、文字列をDateオブジェクトに渡す場合に何を期待するかについての基本的な考えを提供するのに十分なはずです。これをさらに拡張するには、Mozilla Developer NetworkでMozillaが指す次の仕様(IETF RFC 2822タイムスタンプに準拠)を参照してください。

http://tools.ietf.org/html/rfc2822#page-14

Microsoft Developer Networkは、Dateオブジェクトの追加標準であるECMA-402(ECMAScript国際化API仕様)についても言及しています。これは、ECMAScript 5.1標準(および将来の標準)を補完するものです。それはここにあります:

http://www.ecma-international.org/ecma-402/1.0/

いずれにせよ、これは、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/en-us/library/ff743760(v=vs.94).aspx


92

JavaScriptで日付を扱う場合は、必ずDatejsをチェックアウトしてください。toString関数の場合に見られるように、それは非常に印象的で十分に文書化されています。

編集:タイラー・フォーサイスが指摘する、そのdatejsは時代遅れです。私は現在のプロジェクトでそれを使用しており、何の問題もありませんでしたが、これを認識し、別の方法を検討してください。


2
日付を作成するためにdatejsにミリ秒を供給する方法が見つかりませんでした。そのように:var dateTime = new Date(); dateTime.setTime(ミリ秒));
Arne Evertsson、

14
25k?日付だけですか?痛い。
Ben Lesh 2013年

13
Datejsは、5年ほど前から活発に開発されていない古いライブラリです。彼らのソースはGithubとGoogle Codeにあり、どちらも最終更新日は2008年(2013年)です。健全性のために、XDateまたはMoment.jsを使用してください。
タイラーフォーサイス

3
@TylerForsythe私はそれに関するヒント/警告を追加しました。
TimBüthe2013

2
笑日付スクリプトが古くなっています...
rtpHarry

69

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

AM / PMをサポートするために私の目的のために少し拡張しました-下記を参照してください
Michael Angstadt 2013

@WHKでも、私はさらにmomentjsが好きです:D
gongzhitaao

月をキャプチャするときに問題があります:new Date((new Date())。format( 'yyyy-MM-dd'))は5月を返しますが、現在はJunです:-/ whoto解析文字列でタイムゾーンを使用しますか?
e-info128 2014年

1
@WHKこれは実際には非常に原始的な日付パーサーです。念のため日付をいじる必要はありません。さまざまな形式の日付に本当に対処する必要がある場合は、momentjsのようなスタンドアロンライブラリをお勧めします。:D
gongzhitaao 14年

1
@WHK console.log(new Date('2014-06-01')) -> May私はそれがタイムゾーンと関係があると思います:D
gongzhitaao 14年

37

引用する機能は標準のJavaScriptではないため、ブラウザ間での移植性が低いため、適切な方法ではありません。ECMAScriptの3仕様の葉は、解析し、出力形式は、JavaScriptの実装にアップ機能します。 ECMAScript 5は、ISO8601サポートのサブセットを追加します。私はあなたが言及するtoString()関数は1つのブラウザ(Mozilla?)の革新であると信じています

いくつかのライブラリは、これをパラメータ化するルーチンを提供し、一部は広範なローカリゼーションサポートを備えています。dojo.date.localeのメソッドも確認できます。


5
実際に質問に答えようとしても、多くの票は得られません。人気のライブラリをノミネートして、スコアが飛ぶのを見てください!!
RobG 2014

30

私はこの非常にシンプルなフォーマッタを作成しました、それは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())

http://snipplr.com/view/66968.82825/


4
私はこのクラスが好きですが、「静的」クラスである必要があると思います。複数回インスタンス化する必要はありません。(必要ありませんnew DateFmt()
Cheeso 2013年

1
Cheeso:1ページに10の異なる日付をそれぞれ3つの異なる方法でフォーマットするにはどうすればよいですか その場合、このフォーマッターのインスタンスを3つ持つと便利です。これは完全に有効なユースケースであり、これにより除外されます。OPはこれを正しく設計しました。また、構築時にフォーマットを指定すると、特定の方法でフォーマットする必要があるたびにフォーマットを指定するコードの重複を節約できます。
hsanders 2014年

29

フレームワークは無料、限定的だが軽い

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"

これはクロスブラウザですか?とクロスロケール?
イフタ

はい。(ブラウザーユーザー)ローカルタイムゾーンの時刻を表示します。
ジョンウィリアムズ


18

他の回答で提供されているいくつかのオプションを検討した結果、他の人にも役立つと思われる独自の限定的でシンプルなソリューションを作成することにしました。

/**
* 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"));

2
置換操作は実際には効率的ではないため、それを防ぐことをお勧めします。
mrzmyr 2012年

書いたらどうなる?console.log( "日付は:" + dateFormat(new Date()、 "DD / MM / YY"));
hakan 2013

1
上記では2桁の日付が処理されないため、「日付は12/11 / YYです」というテキストが出力されます。これが必要な場合は、returnステートメントの直前に以下を追加できますformat = format.replace("YY", (""+date.getFullYear()).substring(2));。しかし、これは醜くなってきています-おそらくRegExルートまたは同様のものを下に行きたいでしょう。
Ollieベネット

1
@mrzmyr日付のフォーマットがパフォーマンスのボトルネックになると本当に思いますか?いい加減にして。
doug65536 2013

11

これは私がよく使う関数です。結果は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);
}

1
良い答えですが、zp2関数を次のように変更する必要があると思います。var zp2 = function(val){return val <= 9?'00' + val:(val <= 99? '0' + val: '' + val); }
Eric Wang

1
例外があります。ms部分の値が0の場合、それは同じではありません。関数では結果は '00'ですが、 '000'ではありません。
Eric Wang

9

この日付オブジェクトの変更は便利です。これはどのライブラリよりも小さく、さまざまな形式をサポートするように簡単に拡張できます。

注意:

  • 古いブラウザでは定義されていないObject.keys()を使用しているため、特定のリンクからポリフィルを実装する必要がある場合があります。

コード

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

使用する

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

8

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

非常に良い解決策です!var a = new Date(); a.format( 'yyyy-MM-d'); // 2013-08-16を返します。
Adrian Maire、2013

this.getMonth(); iOSで失敗する
N20084753

7

有効な日付形式に関する明確なドキュメントを見つけることができなかったため、さまざまなブラウザーでサポートされているものを確認するための独自のテストを作成しました。

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月9日
  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月9日

[月] / [通年] / [日付番号] -月は、先行ゼロの有無の数字、または短い形式または長い形式の月の名前のいずれかで、日付番号は先行ゼロの有無のどちらでもかまいません。

  • 2013年8月9日
  • 2013年8月9日
  • 2013年8月8日
  • 2013年8月9日
  • 2013年8月
  • 2013年8月/ 9月
  • 2013年8月9日
  • 2013年8月9日

スペースで区切られた[通年]、[月名]、および[日付番号]の任意の組み合わせ -月名は短い形式でも長い形式でもかまいません。日付番号には、先行ゼロがあってもなくてもかまいません。

  • 2013年8月9日
  • 2013年8月09日
  • 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');

6

JavaScriptで日付をフォーマットし、特に解析することは、頭痛の種です。すべてのブラウザーが日付を同じ方法で処理するわけではありません。したがって、基本メソッドを知っておくと便利ですが、ヘルパーライブラリを使用するほうが実用的です。

XDateのJavaScriptライブラリによってアダム・ショー 2011年半ば以来の周りされて、アクティブなまだ開発中ですました。素晴らしいドキュメント、優れたAPI、フォーマットがあり、下位互換性を維持しようとし、ローカライズされた文字列もサポートします。

ロケール文字列の変更へのリンク:https : //gist.github.com/1221376


6

コード例:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

出力:

「13:45:20」


2
toISOString();で注目する価値があります。UTCを出力します。したがってnew Date();// = Fri Nov 22 2013 17:48:22 GMT+0100、上記のコードを使用した出力は"16:48:22"
Tewr

6

ライブラリsugar.jsには、JavaScriptで日付を操作するための優れた機能がいくつかあります。そして、それは非常によく文書化されてます

Sugarは、「1時間前」などの相対形式を含む15の主要言語のほぼすべての形式で日付を理解できるDate.createメソッドから始まる、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"

4

すべてのブラウザ

使用しているソース形式で日付をフォーマットする最も信頼できる方法は、次の手順を適用することです。

  1. オブジェクトnew Date()を作成するために使用しDateます
  2. 使用.getDate().getMonth()および.getFullYear()日、月、年をそれぞれ取得します
  3. 目的の形式に従って、ピースを一緒に貼り付けます

例:

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

このフィドルも参照してください)。


最新のブラウザのみ

組み込みの.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

このフィドルも参照してください)。


(*) MDNよれば、「最新のブラウザ」とは、Chrome 24以降、Firefox 29以降、IE11、Edge12以降、Opera 15以降、Safari ナイトリービルドを意味します


3

私が書いたちょうど別のオプション:

DP_DateExtensionsライブラリ

それが役立つかどうかはわかりませんが、いくつかのプロジェクトで役立ちます-必要なことを行うようです。

日付/時刻のフォーマット、日付の計算(日付の部分の追加/減算)、日付の比較、日付の解析などをサポートします。これは自由にオープンソースです。

すでにフレームワークを使用している場合(それらはすべて使用可能です)、それを考慮する理由はありませんが、プロジェクトに日付操作をすばやく追加する必要があるだけの場合は、チャンスを与えてください。



2

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


1

JsSimpleDateFormatは、日付オブジェクトをフォーマットし、フォーマットされた文字列を解析して日付オブジェクトに戻すことができるライブラリです。Java形式(SimpleDateFormatクラス)を使用します。月と日の名前はローカライズできます。

例:

var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");

1

日付の形式は独自の機能であるため、答えは「どこにもない」です。toString関数が特定の形式に準拠することを意図しているとは思いません。たとえば、ECMAScript 5.1仕様(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf、2/8 / 2013、173ページ)では、toString関数は次のようにドキュメント化されています:

「文字列の内容は実装に依存しています」

以下のサンプルのような関数を使用すると、かなり簡単にフォーマットを実行できます。

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

1

Moment.jsなどのライブラリが提供するすべての機能が必要ない場合は、私のstrftimeポートを使用できます。軽量で(1.35 KB対Moment.js 2.15.0と比較して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


0

「2012-12-29」を返すように日付をフォーマットする正しい方法は、JavaScript Date Formatのスクリプトを使用することです。

var d1 = new Date();
return d1.format("dd-m-yy");

このコードは機能しません:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      

3
上にリンクされた「JavaScript日付フォーマット」にリンクされたスクリプトが必要です
Sebastian Viereck '29年

0

個人的には、PHPとjQuery / javascriptの両方を同等に使用しているため、php.jsの日付関数http://phpjs.org/functions/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のタイムスタンプは秒単位になります。


0

多くのフレームワーク(すでに使用している可能性があります)には、気付かない可能性のある日付形式があります。jQueryUIについてはすでに説明しましたが、Kendo UI(グローバリゼーション)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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.