188

Twitter の日時をローカルの iso-string (prettyDate 用) に 2 日間変換しようとしています。現地時間を正しく取得していないだけです..

次の関数を使用しています:

function getLocalISOTime(twDate) {
    var d = new Date(twDate);
    var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
        d.getMinutes(), d.getSeconds(), d.getMilliseconds());

    // obtain local UTC offset and convert to msec
    localOffset = d.getTimezoneOffset() * 60000;
    var newdate = new Date(utcd + localOffset);
    return newdate.toISOString().replace(".000", "");
}

newdate ではすべて問題ありませんが、toISOString() は再び元の時間に戻します... Thu, 31 May 2012 08:33:41 +0000 の形式の Twitterdate から iso で現地時間を取得するのを手伝ってくれる人はいますか?

4

7 に答える 7

362

moment.js素晴らしいですが、単純なことのために多数の依存関係を取得したくない場合があります。

以下も同様に機能します。

    var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
    
    console.log(localISOTime)  // => '2015-01-26T06:40:36.181'

は、ズールー語のタイムゾーンを表すslice(0, -1)末尾を取り除き、独自のものに置き換えることができます。Z

于 2015-01-26T11:50:02.183 に答える
8

moment.js FTW!!!

日付を瞬間に変換し、好きなように操作するだけです。

var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00

http://momentjs.com/docs/

于 2013-08-05T20:05:14.867 に答える
6

以下の日付関数は、スクリプト ライブラリを追加しなくても目的の効果を実現します。基本的には、単純な日付コンポーネントを適切な形式で連結し、Date オブジェクトのプロトタイプを拡張しただけです。

 Date.prototype.dateToISO8601String  = function() {
    var padDigits = function padDigits(number, digits) {
        return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
    }
    var offsetMinutes = this.getTimezoneOffset();
    var offsetHours = offsetMinutes / 60;
    var offset= "Z";    
    if (offsetHours < 0)
      offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
    else if (offsetHours > 0) 
      offset = "+" + padDigits(offsetHours  + "00", 4);

    return this.getFullYear() 
            + "-" + padDigits((this.getUTCMonth()+1),2) 
            + "-" + padDigits(this.getUTCDate(),2) 
            + "T" 
            + padDigits(this.getUTCHours(),2)
            + ":" + padDigits(this.getUTCMinutes(),2)
            + ":" + padDigits(this.getUTCSeconds(),2)
            + "." + padDigits(this.getUTCMilliseconds(),2)
            + offset;

}

Date.dateFromISO8601 = function(isoDateString) {
      var parts = isoDateString.match(/\d+/g);
      var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
      var isoDate = new Date(isoTime);
      return isoDate;       
}

function test() {
    var dIn = new Date();
    var isoDateString = dIn.dateToISO8601String();
    var dOut = Date.dateFromISO8601(isoDateString);
    var dInStr = dIn.toUTCString();
    var dOutStr = dOut.toUTCString();
    console.log("Dates are equal: " + (dInStr == dOutStr));
}

使用法:

var d = new Date();
console.log(d.dateToISO8601String());

うまくいけば、これは他の誰かに役立ちます。

編集

コメントで言及されている UTC の問題を修正し、この機能についてAlexdateFromISO8601に感謝します。

于 2013-09-19T22:33:38.743 に答える
4

現在の日付と時刻を取得すると非常に役立ちます。

var date=new Date();
  var today=new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().replace(/T/, ' ').replace(/\..+/, '');  
于 2019-07-23T04:58:26.370 に答える