web-dev-qa-db-ja.com

文字列表現を使用せずに設定されたタイムゾーンでDateを作成します

私は、日、月、年の3つのドロップダウンを含むWebページを持っています。数値を取るJavaScriptのDateコンストラクタを使用すると、現在のタイムゾーンのDateオブジェクトが得られます。

new Date(xiYear, xiMonth, xiDate)

正しい日付を入力してください。ただし、夏時間のため、日付はGMT + 01:00と見なされます。

ここでの問題は、このDateをAjaxメソッドに渡し、サーバー上で日付が逆シリアル化されたときにGMTに変換されて1時間を失ったことです。今は、日、月、年を個別にAjaxメソッドに渡すことができましたが、もっと良い方法があるはずです。

受け入れられた答えは私を正しい方向に向けました、しかしそれだけでsetUTCHours()を使うことは変わりました:

Apr 5th 00:00 GMT+01:00 

Apr 4th 23:00 GMT+01:00

それから、UTCの日付、月、年を設定する必要がありました。

Apr 5th 01:00 GMT+01:00

それが私が欲しかったものです。

369
Dan

.setUTCHours()を使うと、実際にはUTC時間で日付を設定することが可能になります。それはあなたがシステムを通してUTC時間を使うことを可能にするでしょう。

ただし、date-stringを指定しない限り、コンストラクターでUTCを使用して設定することはできません。

new Date(Date.UTC(year, month, day, hour, minute, second))を使うと、特定のUTC時刻からDateオブジェクトを作成できます。

445
jishi
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

この答えは、もともとの質問に合わせて作られており、必ずしもあなたが期待する答えを与えるわけではありません。特に、タイムゾーンのオフセットを加算するのではなく減算したいという人がいます。ただし、この解決策のすべてのポイントは、特定の逆シリアル化のためにJavaScriptのdateオブジェクトをハッキングすることであり、すべてのケースで正しいわけではありません。

186
T.W.R. Cole

createDateAsUTC 関数が必要だと思います( convertDateToUTC と比較してください)。

function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}

function convertDateToUTC(date) { 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 
}
152
monsterclub

これが可能だとは思わない-Dateオブジェクトが作成された後、Dateオブジェクトにタイムゾーンを設定する機能はありません。

そして、ある意味でこれは理にかなっています-概念的に(おそらく実装されていない場合); http://en.wikipedia.org/wiki/Unix_timestamp (強調鉱山):

Unix時間、またはPOSIX時間は、時刻を記述するためのシステムであり、午前0時から経過した秒数として定義されます協定世界時(UTC) 1970年1月1日木曜日。

一度構築すると、「リアルタイム」で特定のポイントを表します。タイムゾーンは、その抽象的な時点を人間が読み取れる文字列に変換する場合にのみ関係します。

したがって、コンストラクタでDateが表す実際の時間のみを変更できるのは理にかなっています。悲しいことに、明示的なタイムゾーンを渡す方法はないようです-そして、あなたが呼び出しているコンストラクタは、「ローカル」時間変数を標準的に保存するときにGMTに変換します-したがって、int, int, intコンストラクタを使用する方法はありませんGMT時間。

プラスの面では、代わりにStringを取るコンストラクターを使用するのは簡単です。数値の月を(少なくともFirefoxでは)数値の月に変換する必要さえないので、素朴な実装が機能することを望んでいました。ただし、試してみると、Firefox、Chrome、およびOperaで正常に動作しますが、Konqueror( "Invalid Date")、Safari( "Invalid Date")およびIE( " NaN ")。次のように、月を文字列に変換するためのルックアップ配列があるだけだと思います。

var months = [ '', 'January', 'February', ..., 'December'];

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}
25
Andrzej Doyle

私はこれが古いことを知っていますが、それが役に立つならあなたは瞬間と瞬間の時間帯を使うことができます。あなたがそれらを見ていないならば。

http://momentjs.com/timezone/ /

http://momentjs.com/ /

2つの本当に便利な時間操作ライブラリ。

17

年、月、日、...、タイムゾーンを含むからJavascript Dateオブジェクトを作成するという、多少異なるが関連した問題を処理する場合、つまり文字列を解析する場合デートに - そして、あなたは明らかに不愉快に複雑なダンスをしなければなりません:

// parseISO8601String : string -> Date
// Parse an ISO-8601 date, including possible timezone,
// into a Javascript Date object.
//
// Test strings: parseISO8601String(x).toISOString()
// "2013-01-31T12:34"              -> "2013-01-31T12:34:00.000Z"
// "2013-01-31T12:34:56"           -> "2013-01-31T12:34:56.000Z"
// "2013-01-31T12:34:56.78"        -> "2013-01-31T12:34:56.780Z"
// "2013-01-31T12:34:56.78+0100"   -> "2013-01-31T11:34:56.780Z"
// "2013-01-31T12:34:56.78+0530"   -> "2013-01-31T07:04:56.780Z"
// "2013-01-31T12:34:56.78-0330"   -> "2013-01-31T16:04:56.780Z"
// "2013-01-31T12:34:56-0330"      -> "2013-01-31T16:04:56.000Z"
// "2013-01-31T12:34:56Z"          -> "2013-01-31T12:34:56.000Z"
function parseISO8601String(dateString) {
    var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/;
    var m = timebits.exec(dateString);
    var resultDate;
    if (m) {
        var utcdate = Date.UTC(parseInt(m[1]),
                               parseInt(m[2])-1, // months are zero-offset (!)
                               parseInt(m[3]),
                               parseInt(m[4]), parseInt(m[5]), // hh:mm
                               (m[6] && parseInt(m[6]) || 0),  // optional seconds
                               (m[7] && parseFloat(m[7])*1000) || 0); // optional fraction
        // utcdate is milliseconds since the Epoch
        if (m[9] && m[10]) {
            var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]);
            utcdate += (m[8] === '+' ? -1 : +1) * offsetMinutes * 60000;
        }
        resultDate = new Date(utcdate);
    } else {
        resultDate = null;
    }
    return resultDate;
}

つまり、タイムゾーンなしの日付を使用して「UTC時間」を作成し(つまり、そのロケールがどのロケールにあるか、つまりUTCの「ロケール」を知っていて、ローカルのロケールにデフォルト設定されていません)、指示されたタイムゾーンオフセットを手動で適用します。

5分以上、誰かがJavascriptの日付オブジェクトについて実際にthoughtを持っていたら、それはいいことではないでしょうか。

16
Norman Gray
d = new Date();
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
nd = new Date(utc + (3600000*offset));

offset value base on which location time zone you would like to set 
For India offset value +5.5,
New York offset value -4,
London offset value +1

すべての位置オフセットの場合 WikiのUTC時刻オフセットのリスト

13
Vijay Lathiya

ワンラインソリューション

new Date(new Date(1422524805305).getTime() - 330*60*1000)

1422524805305ではなく、タイムスタンプをミリ秒単位で使用します。330ではなく、タイムゾーンオフセットを分単位のwrtで使用します。 GMT(例:インド+ 5:30は5 * 60 + 30 = 330分)

9
Vinay Vemula

単にタイムゾーンを設定し、それに従って取り戻す

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})
8
Matee Gojra

これは誰かに役立つかもしれません、あなたが新しいコンストラクタに渡すものの終わりにUTCを置く

少なくともクロムではvar date = new Date("2014-01-01 11:00:00 UTC")と言うことができます

8
Drew LeSueur

getTimeZoneOffsetはUTC + zではマイナスです。

var d = new Date(xiYear, xiMonth, xiDate);
if(d.getTimezoneOffset() > 0){
    d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );
}
7
rinjan

正しい日付を取得するために私が見つけた最も簡単な方法は、datejsを使うことです。

http://www.datejs.com/

Ajaxを介して日付を文字列としてこの形式で取得します。 '2016-01-12T00:00:00'

var yourDateString = '2016-01-12T00:00:00';
var yourDate = new Date(yourDateString);
console.log(yourDate);
if (yourDate.getTimezoneOffset() > 0){
    yourDate = new Date(yourDateString).addMinutes(yourDate.getTimezoneOffset());
}
console.log(yourDate);

コンソールは次のようになります。

2016年1月11日19:00:00 GMT-0500(東部標準時間)

2016年1月12日火曜日00:00:00 GMT-0500(東部標準時間)

https://jsfiddle.net/vp1ena7b/3/ /

'addMinutes'はdatejsから来ています、あなたはおそらくあなた自身で純粋なjsでこれを行うことができますが、私は正しい日付を得るためにそれを使う方法を見つけたので私はすでに自分のプロジェクトにdatejsを持っています。

私はこれが誰かに役立つかもしれないと思いました...

5
Barry Franklin
// My clock 2018-07-25, 00:26:00 (GMT+7)
let date = new Date(); // 2018-07-24:17:26:00 (Look like GMT+0)
const myTimeZone = 7; // my timeZone 
// my timeZone = 7h = 7 * 60 * 60 * 1000 (millisecond);
// 2018-07-24:17:26:00 = x (milliseconds)
// finally, time in milliseconds (GMT+7) = x + myTimezone 
date.setTime( date.getTime() + myTimeZone * 60 * 60 * 1000 );
// date.toISOString() = 2018-07-25, 00:26:00 (GMT+7)
4
Tuan Nguyen

のマイレージ

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();
2
meouw

このコードは ブラウザのタイムゾーン - でフォーマットされた Dateオブジェクト を返します。

Date.prototype.timezone = function () {
    this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60));
    return this;
}
2
Marco Dal Zovo

私がこれから見たことがある最もよい解決はから来ました

http://www.codingforums.com/archive/index.php/t-19663.html

プリントタイム機能

<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
    offset++;
    tempDate = new Date()
    tempDate.setTime(UTCDate.getTime()+3600000*(offset))
    timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
    timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
    timeValue += " hrs."
    return timeValue
    }
    var now = new Date()
    var seed = now.getTime() % 0xfffffff
    var same = Rand(12)
</script>

Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>

完全なコード例

<html>

<head>
<script language="javascript" type="text/javascript">
//borrowed from echoecho
//http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482
workDate = new Date()
UTCDate = new Date()
UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000)

function printTime(offset) {
offset++;
tempDate = new Date()
tempDate.setTime(UTCDate.getTime()+3600000*(offset))
timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours()))
timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes())
timeValue += " hrs."
return timeValue
}
var now = new Date()
var seed = now.getTime() % 0xfffffff
var same = Rand(12)
</script>

</head>

<body>
Banff, Canada:
<script language="JavaScript">document.write(printTime("-7"))</script>
<br>
Michigan:
<script language="JavaScript">document.write(printTime("-5"))</script>
<br>
Greenwich, England(UTC):
<script language="JavaScript">document.write(printTime("-0"))</script>
<br>
Tokyo, Japan:
<script language="JavaScript">document.write(printTime("+9"))</script>
<br>
Berlin, Germany:
<script language="JavaScript">document.write(printTime("+1"))</script>

</body>
</html>
1