2017-01-27 6 views
1

Citrixサーバー経由で遠隔地にあるアプリケーションで問題が発生しました。アプリケーションがリモートロケーションで実行されたときに、ユーザーがCitrix経由でアプリケーションにアクセスしていたとしても、リモートロケーションからの時間とともにデータベースにイベントを記録しました。.NET DateTimeはホストマシンの時刻または仮想マシンの時刻にアクセスしますか?

.NETのDateTime.NowはどういうわけかCitrixコンテナを "エスケープ"して、リモートマシンの時刻を見つけましたか、他の説明がありますか?

ここに、アプリケーションの現在の設定があります。

  • アプリケーションは、リモートユーザーがヨーロッパに位置し、Citrixのサーバー・マシンの時刻が設定されている米国
  • でアプリケーションを実行してシミュレートしたCitrix社を介してアプリケーションにアクセスされる
  • 米国内のデータベースにイベントを記録します米国時間へ

PSアプリケーションは、将来保存するときにデータベースから時間を照会するように更新されました。

+1

は(http://stackoverflow.com/questions/29638378/current-date-time-in-java-under-citrix-xenapp [いくつかの質問が有望に見える]少なくとも、前のCitrixを試したことがありません-6-5) –

答えて

6

いくつかのこと:

  • Citrixの「タイムゾーンのリダイレクト」機能は、おそらくあなたが認められたものについての説明です。詳細は、使用している特定のCitrix製品(提供していないもの)に固有のものです。その機能を無効にすることができます。 Googleに問い合わせるか、ServerFaultにお問い合わせください。

  • 実際には、サーバーベースのアプリケーションでDateTime.Nowを使用しないでください。サーバーのタイムゾーン設定が何であるかは関係ありません。適切な場合、TimeZoneInfoクラスとともに、DateTime.UtcNow,DateTimeOffset.UtcNow、またはDateTimeOffset.Nowを使用してください。またはNoda Timeを使用します。

  • タイトルの質問に答えるには、DateTime.Nowhereのソースコードを参照してください。自身がGetSystemTimeAsFileTimeのWin32 APIを呼び出す

    1. コールDateTime.UtcNowを、次のように動作します。これがシステムクロックです。特定のタイムゾーンではなく、UTCの観点からのものです。 VMで実行している場合、通常、このシステムクロックはホストからの時間と同期しています。

    2. ローカルマシンのタイムゾーンに関するデータを取得します。これは、パフォーマンス上の理由から、完全なタイムゾーンの切り捨てバージョンを使用し、将来の再利用のためにデータをキャッシュします。

      Citrixがタイムゾーンをリダイレクトしている場合、この手順に影響します。取得したデータを使用し

    3. 、UTCからのオフセットを計算する - ステップ1

    4. で取得特定UTCポイントのMinTicks又はMaxTicksが変換に超えた場合切り捨て、ローカル時刻を取得するためにオフセットを適用。

    5. 手順4で計算した値にDateTimeKind.Localを付けて、DateTime構造体に戻します。

+0

うん。トムスコット、ノッティンガム大学のノーダタイム(自分自身を転がす前に、このビデオを見ました)(https://youtu.be/-5wpm-gesOY?t=8m38s)を覗いてみましょう。 – MickyD

+0

@MickyD - はい、私たちは皆それを見ました。それは良いです。いくつかのエラーがありますが、その点を示しています。 NodaTimeは、このスペースに優れたものと同様に、標準のtzデータベースを使用します。 :) –

関連する問題