そのための1つの方法は、を解析することnew Date().toLocaleString()
です。ただし、返される文字列はユーザーのロケールに依存しないため、これはchromium / webkitでは機能しません(http://code.google.com/p/chromium/issues/detail?id=3607のバグレポートを参照してください) 。
私は、クライアント側のみで、クロムで機能するソリューションを探していることを強調します。
そのための1つの方法は、を解析することnew Date().toLocaleString()
です。ただし、返される文字列はユーザーのロケールに依存しないため、これはchromium / webkitでは機能しません(http://code.google.com/p/chromium/issues/detail?id=3607のバグレポートを参照してください) 。
私は、クライアント側のみで、クロムで機能するソリューションを探していることを強調します。
これが最後に回答されてから数年が経ち、問題を解決するためにいくつかのテクノロジーが導入されました。そのようなテクノロジーの1Intl.DateTimeFormat
つがです。これは、さまざまなロケールの日付形式に関する豊富な情報を提供します。
console.log(new Intl.DateTimeFormat().resolvedOptions());
console.log(new Intl.DateTimeFormat().resolvedOptions().hour12);
.as-console-wrapper { max-height: 100% !important; }
hour12
ただし、ほとんどのロケールでは、オプションのデフォルトが定義されていません。したがって、これが返される場合はundefined
、関数を調べformatToParts
ます。
const hourParts = new Intl.DateTimeFormat(undefined, { hour: 'numeric' }).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts);
.as-console-wrapper { max-height: 100% !important; }
それからの出力は次のようになります(ブラウザの現在の言語の場合。私の場合は「en-US」)。
[
{
"type": "hour",
"value": "1"
},
{
"type": "literal",
"value": " "
},
{
"type": "dayPeriod",
"value": "PM"
}
]
に等しいvalue
パーツの長さを取得すると、12時間または24時間のどちらでフォーマットされたかがわかります。type
"hour"
たとえば、日本では24時間使用していることを知っているので、次のことを確認できます。
const hourParts = new Intl.DateTimeFormat('ja-JP', {
hour: 'numeric'
}).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts.find(part => part.type === 'hour').value.length);
.as-console-wrapper { max-height: 100% !important; }
そして、私は米国がデフォルトで12時間の時間を設定していることを知っています:
const hourParts = new Intl.DateTimeFormat('en-US', {
hour: 'numeric'
}).formatToParts(new Date(2020, 0, 1, 13));
console.log(hourParts.find(part => part.type === 'hour').value.length);
.as-console-wrapper { max-height: 100% !important; }
これを関数でラップするのは簡単です。
function localeUses24HourTime(langCode) {
return new Intl.DateTimeFormat(langCode, {
hour: 'numeric'
}).formatToParts(new Date(2020, 0, 1, 13)).find(part => part.type === 'hour').value.length === 2;
}
console.log(localeUses24HourTime()); // undefined means current user's language
console.log(localeUses24HourTime('en-US')); // a specific language known to be false
console.log(localeUses24HourTime('ja-JP')); // a specific language known to be true
.as-console-wrapper { max-height: 100% !important; }
これは、の出力を解析するよりも多かれ少なかれ複雑に感じるかもしれませんtoLocaleString()
。
注:回答の途中で、「ロケール」という用語から「言語」という用語に切り替えました。これは、仕様の記述方法と情報の指定方法によるものです。en-US
およびはBCP言語コードであり、日付と時刻のフォーマット規則を検索するためja-JP
にのコンストラクターに渡されます。Intl.DateTimeFormat
仕様では、locale
この情報を参照するためにこの用語を使用していますが、実際には言語識別子であり、リージョン(US
およびJP
上記のコード内)を含む場合がありますが、それらを必要とせず、そのリージョンが必ずしもユーザーのロケール(スペイン語を話し、スペインでそれを学んだ[したがって、言語コード'es-ES'を使用する]が、日付の形式がスペインとは異なる米国に住んでいる人を考えてみてください)。
クロムが修正されない限り、クロムtoLocaleString()
でそれを行う方法はありません。
FirefoxとIEの場合、解析toLocaleString()
によってその情報が得られます。
編集
どうやらtoLocalString()
Chromeで修正されました。したがって、の解析はtoLocaleString()
解決策です。
この方法でローカルパターンを検索しないでください。toLocaleString()
明らかに間違い(Javaから派生)であり、使用しないでください。おっしゃるように、この方法はさまざまなブラウザで十分にサポートされていません(Chromeはそのうちの1つにすぎません)。
実際、(100%正しくはないが)正しく機能する(人気のあるものからの)唯一のWebブラウザーはIEです。
ロケールに応じて日付を正しくフォーマットするには、Globalizeを使用してください。.Netからダンプされたローカライズされたパターンが含まれています。あるいは、ロケール対応のフォーマットを可能にするが、 CLDRに基づくDojo
を
使用することもできます。
JavaScriptにはI18nの新しい標準であるECMA-402があります。Date
この標準では、実際にはJSのオブジェクトを使用できます。ただし、常に言語タグを渡す必要があります。
var date = new Date();
var formatted = date.toLocaleString('de-DE');
これに関する唯一の問題は、現在ECMA-402を実装していることを私が知っている唯一のWebブラウザはGoogleChromeであるということです。
今のところ、まだ道のりはiLibに沿って何かを使用することだと思われます。
(new Date).toLocaleString()
Chromeを除くすべてのブラウザを解析し、Chromenavigator.language
のロケールとその時間形式のマップと照合します。
それが一番嫌いなやり方だとは思いますが、時間を確認するだけではいけませんか?
時刻が12より前の場合は、時刻を午後1時に設定し、出力が13か1かをテストします。
私はそれがアイデアの靴べらであることを知っていますが、素敵なDate.prototype.is24hour()に配置すると、trueを返します。それはうまくいくでしょうか?
私は日付とともにhttp://www.datejs.com/を使用します。私が必要とするすべてをする傾向があります!したがって、これをカスタムプロトタイプ関数と一緒に使用すると、必要なものが得られます。