ユーザーのロケール形式と時間オフセットで日付/時刻を表示する


167

サーバーが常にHTMLのUTCで日付を提供し、クライアントサイトのJavaScriptがそれをユーザーのローカルタイムゾーンに変換するようにします。

ユーザーのロケールの日付形式で出力できる場合のボーナス。

回答:


165

UTC日付で開始する最も確実な方法は、新しいDateオブジェクトを作成し、setUTC…メソッドを使用して目的の日付/時刻に設定することです。

次に、さまざまなtoLocale…Stringメソッドがローカライズされた出力を提供します。

例:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

いくつかの参照:


1
Firefoxでは、toLocateDateString()何かを返す「2014年1月12日(日曜日 ) 」のように見える...
BlueRaja -ダニーPflughoeft

1
うーん、それはかなり深刻な問題です。ブラウザ間で日付を同じにしたい場合は、これらの方法を使用しても機能しません。既知の代替手段はありますか?
Josh Mc

6
上記の初期化の単一行バージョン:var d = new Date(Date.UTC(2004,1,29,2,45,26));
m1kael 14

4
Chrome(v35以降)では、toLocaleString()関数内のユーザーのロケールが考慮されていないことを考慮する価値があります。
benno 2014

8
申し訳ありませんが、この方法は(私はオーストラリアにいます)では機能しません。上記のコードを実行すると、日付が米国の形式で表示されます。さらにMDNは「使用されるロケールと返される文字列の形式は完全に実装に依存する」と述べています。
tgrrr 2016年

65

新しいプロジェクトの場合は、moment.jsを使用してください

この質問はかなり古いため、moment.jsは当時は存在しませんでしたが、新しいプロジェクトでは、このようなタスクを大幅に簡略化します。

次のようにUTCから日付文字列を解析するのが最善です(すべてのブラウザで一貫した結果を得るには、サーバーでISO-8601互換の文字列を作成します)。

var m = moment("2013-02-08T09:30:26Z");

mアプリケーションで使用するだけで、moment.jsはデフォルトで表示操作のローカルタイムゾーンに設定されます。日付と時刻の値をフォーマットしたり、その一部を抽出したりする方法たくさんあります

次のように、ユーザーロケールでモーメントオブジェクトをフォーマットすることもできます。

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

moment.jsオブジェクトを別のタイムゾーン(つまり、ローカルタイムゾーンでもUTCでもない)に変換するには、moment.jsタイムゾーン拡張が必要です。そのページにはいくつかの例もあり、使い方は非常に簡単です。


これをどのように組み合わせるのですか?m.utcOffset(offset).format( 'LLL')が機能していないようです。
バート

万一LuxonまたはDay.jsが今提案し、ライブラリも?
ホーマー

1
追加をお勧めしますFor old projects, just use jQuery
Xenos

まだショー午前/午後の時間は、コンピュータのロケール設定で24時間に設定されているにもかかわらず-クロムの仕事はしません
私たちVIR

20

new Date().getTimezoneOffset()/60タイムゾーンに使用できます。toLocaleString()ユーザーのロケールを使用して日付を表示する方法もあります。

ここでは全体のリストです:日付での作業します


toLocaleStringは、ユーザーが期待する形式で日付を表示するのに非常に信頼できません。ISO 402がサポートされている場合でも、信頼性は低く、フォーマットはロケールではなく言語に基づいています。
RobG 2017年

@RobGの代わりに解決策はtoLocaleString何ですか?
user924

@ user924-ライブラリを使用できます。選択できるものはたくさんあります。toLocaleStringの問題は、実装が異なれば結果も異なり、さまざまな言語や地域のサポートレベルが異なることです。たとえば、私のシステムのデフォルト言語はen-USではありませんが、一部のブラウザのtoLocaleStringのデフォルト形式はUS形式であり、他のブラウザは私のシステム言語を尊重しています。これはタイムゾーン名と同じですが、まったく標準化されていないためさらに悪いです。:-(
RobG

7

日付オブジェクトを作成したら、変換のスニペットを次に示します。

この関数は、UTC形式の日付オブジェクトと形式文字列を受け取ります。プロトタイプ
が必要になりますDate.strftime

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}

6
どこからstrftimeしましたか?
Anuj Pandey

時間の設定は、日付オブジェクトの日/日付/年の部分に影響を与えますか?ないようです。
ChristoKiwi 2017年

1
渡される@ ChristoKiwi値setHoursは整数であることが予想されるgetTimezoneOffset()/60割合戻してもよい(例えば、インドは05のオフセットを:30 5.5を返します)。小数は切り捨てられます。それ以外の場合、時間を設定すると他の値が更新されます(時間を48に設定して、何が起こるか確認してください)。
RobG 2018年

7

JSでは、前述のように各プロパティを変換する以外に、ローカルの日付時刻をフォーマットする単純でクロスプラットフォームの方法はありません。

これは、ローカルのYYYY-MM-DDを取得するために使用する簡単なハックです。これはハックであることに注意してください。最終的な日付は正しいタイムゾーンではなくなります(そのため、タイムゾーンを無視する必要があります)。他に何か必要な場合は、moment.jsを使用します。

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

d.getTimezoneOffset()は時間帯オフセットを分単位で返し、d.getTime()はミリ秒単位なので、x 60,000になります。


1
@VG 60kがどこから来たのかについての情報を追加しました。この助けを願っています。
Jeremy Chone

5

これが私が過去のプロジェクトで使用したものです:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

4
これはASP.NET固有のものです。
ZiggyTheHamster

タイムゾーンのオフセットは必ずしも1時間の倍数であるとは限らないため、getTimezoneOffset()/60多くの場合、10進数の値が返されます。これは、1900年より前の日付に特に当てはまり、多くの場所では分と秒のオフセットがありました。また、過去のオフセットをサポートするためにJavaScriptの日付が必要になりました。たとえば、1890年のモスクワのオフセットは+2:30:17でした。ブラウザ、タイムゾーン、Chrome 67エラーをご覧ください。
RobG 2018年

3

.getTimezoneOffset()メソッドは、タイムゾーンオフセットを分単位で報告し、GMT / UTCタイムゾーンから「西向き」に数えます。その結果、オフセット値は、慣れている値よりも負になります。(例、ニューヨーク時間は+240分または+4時間と報告されます)

時間単位の通常のタイムゾーンオフセットを取得するには、以下を使用する必要があります。

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

重要な詳細:
夏時間は結果に考慮されることに注意してください。この方法で得られるのは、実際の時間オフセットであり、実際の地理的なタイムゾーンオフセットではありません。


3

PHPコードからの日付で、私はこのようなものを使用しました。

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

このように呼ぶことができます

var localdateObj = getLocalDate('2015-09-25T02:57:46');

問題は、PHPではなくJavaScriptに関するものでした。
pipedreambomb

5
回答はJavaScriptのみです。サーバーの日付がUTCであることが問題で言及されています。したがって、サーバーはどの言語でもかまいません。それで私はPHPのみに答えました
hriziya

3

これまでの回答を組み合わせて追加しました。これは、ユーザーのローカルタイムゾーン形式でdbからの日付時刻文字列を表示するために、それらすべてを読んでしばらく調査する必要があったためです。

日時文字列は、python / django dbから次の形式で取得されます:2016-12-05T15:12:24.215Z

JavaScriptでのブラウザー言語の信頼できる検出は、すべてのブラウザーで機能するようには見えません(ブラウザー言語設定の検出についてはJavaScriptを参照してください))ため、サーバーからブラウザー言語を取得します。

Python / Django:リクエストのブラウザ言語をコンテキストパラメータとして送信:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML:非表示の入力に書き込みます。

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript:非表示の入力の値を取得します(例:en-GB、en-US; q = 0.8、en; q = 0.6 /)。次に、置換と正規表現を介してのみ、リストの最初の言語を取得します

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript:日時に変換してフォーマットします。

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

参照:https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

結果は次のとおりです(ブラウザの言語はen-gb):2016年5月12日、14:58


3

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);


参考のために:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…(私optionsは私のケースの一部が必要でした)
Xenos

2

私が遭遇した最良の解決策は、[time display = "llll" datetime = "UTC TIME" /]タグを作成し、javascript(jquery)を使用して、ユーザーの時間と比較してそれを解析および表示することです。

http://momentjs.com/ Moment.js

時間をきれいに表示します。


2

以下を使用できます。これは、GMTからのタイムゾーンオフセットを分単位で報告します。

new Date().getTimezoneOffset();

注:-この関数は負の数を返します。


1

getTimeZoneOffset()とtoLocaleStringは基本的な日付作業に適していますが、実際のタイムゾーンのサポートが必要な場合は、mdeのTimeZone.jsを参照してください

この質問への回答で説明されているいくつかのオプションがあります


1

日付をローカル日付に変換するには、toLocaleDateString()メソッドを使用します。

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

時間を現地時間に変換するには、toLocaleTimeString()メソッドを使用します。

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

-12

ロケールの方法がわかりませんが、JavaScriptはクライアント側のテクノロジーです。

usersLocalTime = new Date();

クライアントの時刻と日付が含まれます(ブラウザによって報告され、拡張機能として、ユーザーが座っているコンピュータによって報告されます)。応答にサーバーの時間を含め、簡単な計算を行って、最終的なオフセットを推測するのは簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.