すべてをクライアントに送信して処理させるのではなく、http を介してリクエストで何かを読み取ることにより、サーバー側でタイムゾーン オフセットを行う方法はありますか?
5 に答える
これはより複雑ですが、マシンとユーザー プロファイルの設定が訪問者の好みと一致しない場合があるため、以前はこのシナリオに頼らなければなりませんでした。たとえば、英国の訪問者がオーストラリアのサーバーから一時的にサイトにアクセスしたとします。
@balabaster が提案するジオロケーション サービス (MaxMind.com など) を使用して、IP に一致するゾーンを取得します (Global.Session_Start が最適です)。これはローカル ISP には適していますが、AOL にはあまり適していません。これからのオフセットをセッション Cookie に保存します。
または、JavaScript を使用して、ユーザーがサイトに入ったときにフォームの送信/リダイレクトの一部としてタイム ゾーン オフセットを取得します。これはブラウザの現在のオフセットですが、必ずしも訪問者の優先ゾーンではありません。この値をデフォルトとして使用します。別のセッション Cookie に保存します。
<script type="text/javascript" language="JavaScript"> var offset = new Date(); document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>'); </script>
永続的な Cookie (匿名ユーザーの場合) とアカウント プロファイルのフィールド (認証されている場合) を使用して、訪問者がゾーンを更新できるようにします。
からの永続的な値 #3 は、セッションの値をオーバーライドします。認証されたユーザーがログインするまでの時間を表示するために、同じ永続的な Cookie を保存することもできます。
Page Unload...Request.ServerVariables より前のいずれかのイベント。物理的なタイムゾーンが必要な場合は、IP アドレスを確認し、IP からジオロケーションへの変換ツールを使用します。
別の方法があるかどうかわからないので、コンピューターが構成されているタイムゾーンが必要な場合は、javascript のページ読み込みを待つ必要があります...
すべてをクライアントに送信して処理させるのではなく、http を介してリクエストで何かを読み取ることにより、サーバー側でタイムゾーン オフセットを行う方法はありますか?
WCF Web サービスで同じ問題が発生したときに思いついた解決策は次のとおりです。
ユーザーのローカル タイムゾーンで DateTimes を返すように WCF Web サービスを取得する方法
基本的に、JavaScript/Angular コードを取得してユーザーのタイムゾーンを決定し、この値を WCF Web サービスの 1 つに渡します。
getListOfRecords
timezone-offset 値という 1 つのパラメーターを取るWeb サービスを呼び出す方法に注目してください。
$scope.loadSomeDatabaseRecords = function () {
var d = new Date()
var timezoneOffset = d.getTimezoneOffset();
return $http({
url: 'http://localhost:15021/Service1.svc/getListOfRecords/' + timezoneOffset,
method: 'GET',
async: true,
cache: false,
headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' }
}).success(function (data) {
$scope.listScheduleLog = data.Results;
});
}
そこから、私の C# コードはデータベース レコードを読み取り、そのタイムゾーン オフセットを UTCDateTime
値に適用して、それをクライアントに返します。