回答:
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
var d = new Date(Date.UTC(2004,1,29,2,45,26));
toLocaleString()
関数内のユーザーのロケールが考慮されていないことを考慮する価値があります。
この質問はかなり古いため、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タイムゾーン拡張が必要です。そのページにはいくつかの例もあり、使い方は非常に簡単です。
For old projects, just use jQuery
new Date().getTimezoneOffset()/60
タイムゾーンに使用できます。toLocaleString()
ユーザーのロケールを使用して日付を表示する方法もあります。
ここでは全体のリストです:日付での作業します
toLocaleString
何ですか?
日付オブジェクトを作成したら、変換のスニペットを次に示します。
この関数は、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);
}
getTimezoneOffset()/60
割合戻してもよい(例えば、インドは05のオフセットを:30 5.5を返します)。小数は切り捨てられます。それ以外の場合、時間を設定すると他の値が更新されます(時間を48に設定して、何が起こるか確認してください)。
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になります。
これが私が過去のプロジェクトで使用したものです:
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');
getTimezoneOffset()/60
多くの場合、10進数の値が返されます。これは、1900年より前の日付に特に当てはまり、多くの場所では分と秒のオフセットがありました。また、過去のオフセットをサポートするためにJavaScriptの日付が必要になりました。たとえば、1890年のモスクワのオフセットは+2:30:17でした。ブラウザ、タイムゾーン、Chrome 67エラーをご覧ください。
の .getTimezoneOffset()
メソッドは、タイムゾーンオフセットを分単位で報告し、GMT / UTCタイムゾーンから「西向き」に数えます。その結果、オフセット値は、慣れている値よりも負になります。(例、ニューヨーク時間は+240分または+4時間と報告されます)
時間単位の通常のタイムゾーンオフセットを取得するには、以下を使用する必要があります。
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60
重要な詳細:
夏時間は結果に考慮されることに注意してください。この方法で得られるのは、実際の時間オフセットであり、実際の地理的なタイムゾーンオフセットではありません。
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');
これまでの回答を組み合わせて追加しました。これは、ユーザーのローカルタイムゾーン形式で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
// 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);
options
は私のケースの一部が必要でした)
私が遭遇した最良の解決策は、[time display = "llll" datetime = "UTC TIME" /]タグを作成し、javascript(jquery)を使用して、ユーザーの時間と比較してそれを解析および表示することです。
http://momentjs.com/ Moment.js
時間をきれいに表示します。
getTimeZoneOffset()とtoLocaleStringは基本的な日付作業に適していますが、実際のタイムゾーンのサポートが必要な場合は、mdeのTimeZone.jsを参照してください。
この質問への回答で説明されているいくつかのオプションがあります
toLocateDateString()
何かを返す「2014年1月12日(日曜日 ) 」のように見える...