475

日、月、年の 3 つのドロップダウンがある Web ページがあります。Date数値を取るJavaScript コンストラクターを使用するDateと、現在のタイムゾーンのオブジェクトを取得できます。

new Date(xiYear, xiMonth, xiDate)

正しい日付を指定しますが、夏時間のため、日付は GMT+01:00 であると見なされます。

ここでの問題は、これDateを Ajax メソッドに渡し、サーバー上で日付が逆シリアル化されると、GMT に変換されて 1 時間が失われ、1 日が 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

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

4

28 に答える 28

530

これを使用.setUTCHours()すると、実際に UTC 時間で日付を設定することが可能になり、システム全体で UTC 時間を使用できるようになります。

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

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

于 2009-01-13T17:12:20.750 に答える
215
var d = new Date(xiYear, xiMonth, xiDate);
d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

この回答は、元の質問に合わせて特別に調整されており、必ずしも期待する回答が得られるわけではありません。特に、タイムゾーン オフセットを加算する代わりに減算したい人もいます。ただし、このソリューションの全体的なポイントは、特定の逆シリアル化のために JavaScript の日付オブジェクトをハックすることであり、すべての場合に正しいわけではないことに注意してください。

于 2013-04-16T22:22:19.113 に答える
28

これが可能だとは思いません.Dateオブジェクトを作成した後にタイムゾーンを設定することはできません.

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

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

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

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

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

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

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}
于 2009-01-13T16:44:10.807 に答える
19

タイムゾーンを含む、年、月、日などから Javascript Date オブジェクトを作成するという、少し異なるが関連する問題に対処したい場合、つまり、文字列を解析して 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 の「ロケール」であるかがわかり、ローカルのロケールにデフォルト設定されていません)、指定されたタイムゾーン オフセットを手動で適用します。

誰かが実際に Javascript の日付オブジェクトについて 5 分以上考えていたらよかったと思いませんか....

于 2013-01-31T22:36:45.110 に答える
8

これは誰かを助けるかもしれません.UTCを新しいコンストラクタに渡すものの最後に置きます

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

于 2014-08-28T14:39:54.683 に答える
8

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

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

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

于 2015-01-29T09:56:02.857 に答える
6

正しい日付を取得する最も簡単な方法は、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 (東部標準時)

Tue Jan 12 2016 00:00:00 GMT-0500 (東部標準時)

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

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

私はこれが誰かを助けるかもしれないと思った...

于 2016-10-05T13:11:19.317 に答える
3

任意のマイレージ

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();
于 2009-01-13T17:11:39.940 に答える
1

これから見た最良の解決策は、

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>
于 2013-05-17T17:13:02.037 に答える
1
const date = new Date("2020-12-16 17:45:00 UTC");

正常に動作します。

于 2020-12-16T20:47:35.080 に答える
-15

これが最善の解決策です

使用:

// TO ALL dates
Date.timezoneOffset(-240) // +4 UTC

// Override offset only for THIS date
new Date().timezoneOffset(-180) // +3 UTC

コード:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset();

Date.setTimezoneOffset = function(timezoneOffset) {
  return this.prototype.timezoneOffset = timezoneOffset;
};

Date.getTimezoneOffset = function() {
  return this.prototype.timezoneOffset;
};

Date.prototype.setTimezoneOffset = function(timezoneOffset) {
  return this.timezoneOffset = timezoneOffset;
};

Date.prototype.getTimezoneOffset = function() {
  return this.timezoneOffset;
};

Date.prototype.toString = function() {
  var offsetDate, offsetTime;
  offsetTime = this.timezoneOffset * 60 * 1000;
  offsetDate = new Date(this.getTime() - offsetTime);
  return offsetDate.toUTCString();
};

['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear', 'Year', 'Day'].forEach((function(_this) {
  return function(key) {
    Date.prototype["get" + key] = function() {
      var offsetDate, offsetTime;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      return offsetDate["getUTC" + key]();
    };
    return Date.prototype["set" + key] = function(value) {
      var offsetDate, offsetTime, time;
      offsetTime = this.timezoneOffset * 60 * 1000;
      offsetDate = new Date(this.getTime() - offsetTime);
      offsetDate["setUTC" + key](value);
      time = offsetDate.getTime() + offsetTime;
      this.setTime(time);
      return time;
    };
  };
})(this));

コーヒーバージョン:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset()


Date.setTimezoneOffset = (timezoneOffset)->
    return @prototype.timezoneOffset = timezoneOffset


Date.getTimezoneOffset = ->
    return @prototype.timezoneOffset


Date.prototype.setTimezoneOffset = (timezoneOffset)->
    return @timezoneOffset = timezoneOffset


Date.prototype.getTimezoneOffset = ->
    return @timezoneOffset


Date.prototype.toString = ->
    offsetTime = @timezoneOffset * 60 * 1000
    offsetDate = new Date(@getTime() - offsetTime)
    return offsetDate.toUTCString()


[
    'Milliseconds', 'Seconds', 'Minutes', 'Hours',
    'Date', 'Month', 'FullYear', 'Year', 'Day'
]
.forEach (key)=>
    Date.prototype["get#{key}"] = ->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        return offsetDate["getUTC#{key}"]()

    Date.prototype["set#{key}"] = (value)->
        offsetTime = @timezoneOffset * 60 * 1000
        offsetDate = new Date(@getTime() - offsetTime)
        offsetDate["setUTC#{key}"](value)
        time = offsetDate.getTime() + offsetTime
        @setTime(time)
        return time
于 2016-11-10T02:10:24.467 に答える