2017-02-09 14 views
0

まずは、ローカル日付をJavascriptでUTCに変換する方法を知っています。これはその複製ではありません。JavaScriptの日付をUTCに変換します(すでにUTCの場合は変更しないでください)

私は日付がUTCに変換される関数を取得しようとしていますが、まだ入力されていない場合、入力がUTCかどうかを制御できません。私はJavascriptプラグインを使用することはできません。

通常の解決策は、現地の日付をUTCに解析するだけですが、すでにUTCになっている日付を解析することです。は、すでにUTCの日付を間違って変更する奇妙な動作を出力します

私は以下の関数例を持っています。でも、UTCの日付はタイムゾーンのオフセットを持っていることを

function temp() { 
    var utc = new Date(Date.UTC(2017, 1, 10, 10, 10, 0)); 
    var local = new Date(2017, 1, 10, 10, 10, 0); 

    var utc2 = new Date(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate(), utc.getUTCHours(), utc.getUTCMinutes(), utc.getUTCSeconds()); 
    var local2 = new Date(local.getUTCFullYear(), local.getUTCMonth(), local.getUTCDate(), local.getUTCHours(), local.getUTCMinutes(), local.getUTCSeconds()); 

    var utc3 = new Date(utc.getTime() + utc.getTimezoneOffset()*60*1000); 
    var local3 = new Date(local.getTime() + local.getTimezoneOffset()*60*1000); 

    Logger.log("Timezone offset: UTC=" + utc.getTimezoneOffset() + " Local=" + local.getTimezoneOffset()); 
    Logger.log("UTC: " + utc.getTime() + " -> UTC2(" + utc2.getTime() + ") or UTC3(" + utc3.getTime() +")"); 
    Logger.log("Local: " + local.getTime() + " -> UTC2(" + local2.getTime() + ") or UTC3(" + local3.getTime() +")"); 
} 

戻り

Timezone offset: UTC=420 Local=420 
UTC: 1486721400000 -> UTC2(1486746600000) or UTC3(1486746600000) 
Local: 1486746600000 -> UTC2(1486771800000) or UTC3(1486771800000) 

注意。そして、現地の日付をUTCに変換する両方の方法は、すでにUTCの日付を間違って変更しています。

ありがとうございました。

+0

ECMAScript Dateオブジェクトについて言及するとき、「*私はローカル日付をJavascript *でUTCに変換する方法を知っています」というフレーズは意味をなさない。 Javascriptの日付は常に** UTCですが、UTCに変換することはできません。あなたが解析したい文字列を持っているなら、それは別の話です。しかし、あなたの質問には解析がありません。 – RobG

+0

"* ... UTC日付でさえタイムゾーンオフセット*"があります。日付にはタイムゾーンオフセットがありません。 * getTimezoneOffset *メソッドは、ホストシステムからのオフセットを取得します。Dateインスタンスとは何の関係もありません。 – RobG

答えて

0

動作には何も変わりありません。残念ながら、あなたの質問には答えはありません(デフォルトのJavaScript Dateの実装を使用)。

JavaScriptでは、各Dateはエポックからのミリ秒で表されます。 Dateインスタンスは、インタプリタ(ブラウザなど)のタイムゾーン内で常に処理されます。したがって、new Date(Date.UTC(2017, 1, 10, 10, 10, 0));を呼び出すと、1486721400000で表されるDateインスタンスが実際に作成されます。

getTimezoneOffset()メソッドは、常に現在のタイムゾーンの観点から値を返します。私の場合(カリフォルニア州)中のSO、以下:(コメント付き)

document.write(new Date(Date.UTC(2017, 1, 8, 10, 0, 0)).toString()); 
document.write("<br/>"); 
document.write(new Date(Date.UTC(2016, 8, 8, 10, 0, 0)).toString()); 

出力

480 // Wed Feb 08 2017 02:00:00 GMT-0800 (PST) 
420 // Thu Sep 08 2016 03:00:00 GMT-0700 (PDT) 

をあなたの質問

私が考えることができる唯一のソリューションのための答えを見つけようとあなたは独自のDate実装を作成しています(プラグインを使用しないためです)。 Dateを作成することもできます。これにはタイムゾーンを保存することも、DateUTCであるかどうかを定義するフラグを設定することもできます。 JavaScriptライブラリの使用方法を再考する場合は、たとえばhttps://momentjs.com/timezone/などをご覧ください。ここで

はまた、あなたが

function TzDate (date, utc) { 
 
    if (date instanceof Date) { 
 
    this.date = date; 
 
    this.utc = utc ? true : false; 
 
    } else if (typeof date === 'number') { 
 
    this.date = new Date(date); 
 
    this.utc = true; 
 
    } else if (typeof date === 'boolean') { 
 
    this.date = new Date(); 
 
    this.utc = date; 
 
    } else { 
 
    this.date = new Date(); 
 
    this.utc = utc ? true : false; 
 
    } 
 
} 
 
    
 
TzDate.prototype = { 
 
    toString: function() { 
 
    return this.isUTC() ? this.date.toUTCString() : this.date.toString() 
 
    }, 
 
    
 
    getTimezoneOffset: function() { 
 
    return this.isUTC() ? 0 : this.date.getTimezoneOffset(); 
 
    }, 
 

 
    isUTC: function() { 
 
    return this.utc; 
 
    } 
 
}; 
 

 
console.log(new TzDate().toString()); 
 
console.log(new TzDate(true).toString()); 
 
console.log(new TzDate(Date.UTC(2017, 1, 8, 10, 0, 0)).toString()); 
 
console.log(new TzDate(new Date(2017, 1, 8, 10, 0, 0)).toString());

独自の実装を使い始めることができる方法上のサンプルを参照します

+0

ありがとう、私はGoogle Apps Scriptを使用していますが、momentjsの回避策は長期間安定しているようには見えません。私はライブラリーをインストールしたり、ライブラリを含めたりすることは本当にありません。 – therealdavidhenderson

+0

ちょっとしたコードスニペットを追加しました。このコードスニペットは、あなたが何ができるのかを知るために役立ちます。 – Philipp

関連する問題