JavaScriptでシステムの短い日付形式を取得する方法はありますか?
たとえば、システムの短い日付がアメリカ形式かどうかなどです。m/d/Y またはヨーロッパ語で。日/月/年
注意: これは、日付のフォーマットや位置情報に基づく計算に関する質問ではなく、OS/システムからのフォーマットの取得に関する質問です。
JavaScriptでシステムの短い日付形式を取得する方法はありますか?
たとえば、システムの短い日付がアメリカ形式かどうかなどです。m/d/Y またはヨーロッパ語で。日/月/年
注意: これは、日付のフォーマットや位置情報に基づく計算に関する質問ではなく、OS/システムからのフォーマットの取得に関する質問です。
ちょっとした調査の後、技術的には地域設定を取得することは不可能であり、これによって日付形式を取得することはできないと結論付けましたが、他にもいくつかのことができます。次のいずれかのオプションを選択してください:
a) 既に述べた、時代遅れの「toLocaleString()」関数:
var myDate = new Date(1950, 01, 21, 22, 23, 24, 225);
var myDateFormat = myDate.toLocaleString();
alert (myDateFormat);
問題:
1) "myDateFormat.replace" で日付マスクを取得することはできません。月は文字列に "01"、"02" などとして格納されず、代わりにロケールに基づいてテキストとして格納されるためです ("February" など)。英語ですが、ギリシャ語では「Φεβρουάριος」であり、クリンゴン語などで何を知っている人もいます)。
2) 異なるブラウザでの異なる動作
3) 異なる OS およびブラウザ バージョンでの異なる動作...
b) のtoISOString()
代わりに関数を使用しますtoLocaleString()
。ロケールの日付マスクは取得しませんが、日付のどの部分がどこにあるかを知ることができる日付を取得します (つまり、「月」または「日」がその文字列のどこにあるか)。getUTCDate()
、getUTCMonth()
およびgetUTCDay()
関数を使用することもできます。クライアントが使用する日付形式はまだわかりませんが、ただし、日付を取得すると、どの年/月/日/などで作業しているかがわかります。使用code
上記の機能をテストして、期待できることを確認してください。
c)
Inconsistent behavior of toLocaleString() in different browser article を読み、そこに記載されている (IMHO great) ソリューションを使用します
それは不可能。ユーザーのブラウザーからカルチャを取得し、いくつかの js ライブラリを使用して正しい日付形式に変換できます。http://code.google.com/p/datejs/
ユーザーのブラウザが使用している形式を特定するための回避策を作成しました。これは C# ですが、ロジックは同じです。
手順は次のとおりです。
最初に、ユーザーのブラウザの日付をアメリカの形式 (mm-dd-yyyy) に変換してみてください。Convert.ToDateTime はアメリカの日付形式を使用しています。
それが失敗した場合は、ユーザーがヨーロッパ形式 (dd-mm-yyyy) を使用していることを意味します。ただし、これは有効な月ではないため、13 日から 31 日までしかカバーしません。
変換が成功した場合は、変換された日付が現在の UTC 日 + 1 日 (UTC+14 をカバーするため) と現在の UTC 日 - 1 日 (UTC-12 をカバーするため) の間にあるかどうかを判断するために別のチェックを行います。 https://www.timeanddate.com/time/current-number-time-zones.html
変換された日付が現在の日付範囲外である場合、ユーザーのブラウザがヨーロッパ形式 (dd-mm-yyyy) を使用していることを意味し、必要に応じてアメリカ形式に変換できます。
string localeDateString = "01/11/2020"; // e.g. input is using European format (dd-mm-yyyy)
var localeDate = new DateTime();
try
{
localeDate = Convert.ToDateTime(localeDateString);
//var checkTheFormatOfDateInput = localeDate.ToLongDateString();
var currentDateTime = DateTime.UtcNow;
//var currentDateTime = Convert.ToDateTime("11/01/2020");
//var checkTheFormatOfCurrentDate = Convert.ToDateTime("11/01/2020").ToLongDateString();
var currentDateTimePositive = currentDateTime.AddDays(1);
var currentDateTimeNegative = currentDateTime.AddDays(-1);
var outOfCurrentDateRange = !(localeDate.Ticks > currentDateTimeNegative.Ticks && localeDate.Ticks < currentDateTimePositive.Ticks);
if (outOfCurrentDateRange)
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
}
catch
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
//var checkTheEndResultFormat = localeDate.ToLongDateString();
以下は、メソッドにラップされたクリーンなコードです。
private DateTime ConvertAmericanOrEuropeanDateFormatToAmericanDateFormat(string localeDateString)
{
var localeDate = new DateTime();
try
{
localeDate = Convert.ToDateTime(localeDateString);
var currentDateTime = DateTime.UtcNow;
var currentDateTimePositive = currentDateTime.AddDays(1);
var currentDateTimeNegative = currentDateTime.AddDays(-1);
var outOfCurrentDateRange = !(localeDate.Ticks > currentDateTimeNegative.Ticks && localeDate.Ticks < currentDateTimePositive.Ticks);
if (outOfCurrentDateRange)
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
}
catch
{
localeDate = DateTime.ParseExact(localeDateString, "dd/MM/yyyy", CultureInfo.InvariantCulture);
}
return localeDate;
}
非常に優れた長い回答がここにあります: https://stackoverflow.com/a/9893752/2484903
ここで短いもの:
let customDate = new Date(2222, 3, 8);
let strDate = customDate.toLocaleDateString();
let format = strDate
.replace("04", "MM")
.replace("4", "M")
.replace("08", "dd")
.replace("8", "d")
.replace("2222", "yyyy")
.replace("22", "yy");
console.log(format);
既知の日付の日付オブジェクトを作成し、結果を解析します。
最初に (日付定義"04"
に対応する)を探します。3
これは 2 桁の月の形式ですMM
。見つからない場合は、1 桁の形式である必要がありますM
。その後、日と年についても同じことを行います。
Date.CultureInfo.formatPatterns.shortDate を使用する