2017-01-25 2 views
0

タイムゾーンを理解するために多くの時間を費やしました。しかし、私はまだ混乱しています。サーバーのタイムゾーンでデータを送信する

デザイン:

1)クライアントとは異なるタイムゾーンにあるサーバー。

2)私は、APIの呼び出しで、次の情報を得た:

/API /設定/ V1 /システム/時間

{ 
    "timeZoneOffset": -18000000, (milli sec) 
    "serverTimeUTC": 1485332569157, 
    "serverTime": "Wed Jan 25 03:22:49 EST 2017", 
    "timeZone": "Eastern Standard Time" 
} 

3)私は、サーバー上のアクセス権がありません。 (実際にコードを変更することはできません!)

4)私はクライアント側で完全なアクセス権を持っています。 (Javascriptを)

問題/要件:

  • 私はクライアントの時間(PST、CSTなど)を取り、対応するサーバの時間でそれを送りたいです。 (サーバーがある時間帯に関係なく)(必ずしもUTCである必要はありません)。

マイコード:

私は次のことを試みたが、それでも私は行くよどこのように混乱してきました:

getServerTimeZone: function(newTime){ 

     var _this = this; 
     $.ajax({ 
      url: '/api/config/v1/system/time' 
     }) 
     .done(function(data) { 
      if(!newTime){ 
       newTime = new Date(); 
      } 
      //Get Server Timezone and offset 
      //Offset is in milli sec. Converting it to hours 
      var serverTimeOffset = data.timeZoneOffset/(60 * 60 * 1000); 

      // Get current timezone offset for host device 
      var x = new Date(); 
     var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset()/60; 

      //Calculate the difference 
      var actualOffset = Math.abs(clientCurrentTimeZoneOffsetInHours - serverTimeOffset); 

      //Format actual time in relative to server time 
      serverTime = moment.utc(newTime).zone(actualOffset).format('MM/DD/YYYY h:mm A'); 
     }); 
    }, 

答えて

1

以下の変更されたコードを参照してください私たちは、クライアントのタイムゾーンの日付を変更することができますので、私は一瞬JS操作機能はutcoffsetを使用。

クライアントの日付/時刻に基づいて、対応するサーバーの日付/時刻が表示されます。

getServerTimeZone:関数(NEWTIME){

var _this = this; 
$.ajax({ 
    url: '/api/config/v1/system/time' 
}) 
.done(function(data) { 
    if(!newTime){ 
     newTime = new Date(); 
    } 
     //Get Server Timezone and offset 
     //Offset is in milli sec. Converting it to hours 
     var serverTimeOffset = data.timeZoneOffset/(60 * 60 * 1000); 

     // Get current timezone offset for host device 
     var x = new Date(); 
     var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset()/60; 

     // change the timezone using utcOffset 
     serverTime = moment(x).utcOffset(serverTimeOffset).format('MM/DD/YYYY h:mm A'); 
    }); 

}、

あなたはここでそれをテストすることができ、私が使用-5オフセット。

https://jsbin.com/puvutevomo/edit?html,js,output

+0

私はあなたを愛しています!どうもありがとうございます!どのように私はそれを逃した..ありがとう! – TechnoCorner

+0

あなたの問題を解決してうれしいです。 – ngeksyo

0

を、私はあなたがいけない正しく要件を理解していた場合タイムゾーン固有の情報をサーバーまで送信する必要があります。日付/時刻がISO8601形式で与えられ、最後にxがある場合は、UTC形式です。その時点のタイムゾーンは無関係で、表示目的でのみ使用されます。

モーメントは、その日付/時刻を自動的に(ブラウザの設定に基づいて)ユーザーの正しいタイムゾーンに表示します。

var d = moment('2016-01-01T00:00:00.000Z'); 
console.log(d.format('llll')); //This will output the date/time relative to the user's timezone automatically 

var sendToServer = d.toISOString() //send this string up to the server. It is in UTC format. 
+0

しかし、私の要件は、ありませんでした。私は '対応する'サーバーのタイムゾーンで日付/時刻を送信したいと思います。 UTCではありません。私が言っているのは、現地時間(UTCではなく)で動作するcron(サーバー上)があるからです。 – TechnoCorner

+0

サーバーはどのような日付形式を受け入れますか?サーバーがISO8601形式の日付を格納していても、cronジョブの実行時間は関係ありません。cronジョブ自体の一部としてタイムゾーンの違いが考慮されます。 – richwol

+0

サーバーはlocaltimeのみを受け入れます。サーバーは、日付をISO8601形式で保管しません。サーバーのタイムゾーンでデータを送り返すことは可能ですか? – TechnoCorner

関連する問題