0

MVC 4 (C#) でオンライン試験アプリケーションを作成していますが、試験の時間制限 (期間) を適用するのに問題があります。これを行う簡単な方法は、サーバーに開始時刻 (サーバーの UTC 時間) を保存させ、UTC から変換されたこのタイムスタンプを使用してクライアントに終了日を計算させることです。問題は、このアプローチでは、タイムゾーン、サーバー/クライアント間の非同期クロック、閏年など、カレンダーの問題が考慮されていないことです。

例: ユーザーが 60 分の制限時間で試験を開始します。サーバーは開始時刻を (コントローラー アクションで) 認識し、試験期間の終了時にサーバー側の検証を行う必要があります。同時に、クライアント側はカウントダウン (javascript?) を表示し、制限に達すると試験を終了する必要があります。

この例に従いましたが、サーバーの時刻をクライアントのタイムゾーンに変換するだけです。クライアントのクロックが同期していない場合、問題が発生します。これを私の試験環境に当てはめると、試験時間は正確に 60 分ではなく、+/- 時間ずれることさえあります。

最善のアプローチが何であるかについてのアイデアはありますか? コード例は大歓迎です。

ところで、私は MVC/javascript にかなり慣れていません。

4

1 に答える 1

2

私はあなたの分析に同意しません。

私は物理学と相対性理論と同期クロックの問題について知っていますが、あなたの問題は単純だと思います.

サーバーは、その時刻についてのみ知る必要があります。ユーザーがタスクを完了するのに X 時間かかる場合、サーバーが知る必要があるのは、クライアントが最初のジェスチャでアクションを開始したときの現地時間だけです。そのミリ秒から X 時間後、試験は終了します。

EndTime(Server) = StartTime(Server) + Delta

デルタを求める:

Delta = EndTime(Server) - StartTime(Server)

別のタイム ゾーンのユーザーは、試験が開始されたときの時計の読みが異なっていると言うかもしれませんが、経験するデルタは同じです。

クライアントの観点から同じ方程式を書きましょう。

StartTime(Client) = StartTime(Server) + TimeZoneDelta
EndTime(Client) = EndTime(Server) + TimeZoneDelta

それらをデルタの他の方程式に代入します。

Delta = EndTime(Client) - TimeZoneDelta - StartTime(Client) + TimeZoneDelta
Delta = EndTime(Client) - StartTime(Client)

日付と時刻をローカル タイム ゾーンで表示することは別の問題です。あなたの記事は別の問題について議論しています。

クライアントが毎分サーバーに対して繰り返し AJAX 呼び出しを行って、テストの残り時間を確認し、進行状況バーを更新しているのがわかります。クライアントは視覚的なフィードバックを高く評価し、クライアントとサーバーの分離に関係なく、サーバーは常に正しい回答を送信します。

于 2013-10-23T12:01:18.587 に答える