0

アプリケーションで非常に奇妙な動作をしています。サーバーはニューヨーク (-5 GMT タイムゾーン) にあり、クライアント - 私はルーマニア (+2 GMT タイムゾーン) にあるため、7 時間の不一致があります。私が直面している問題は、日付を保存しようとするときです。たとえば、12:00 (日は関係ありません) としましょう。クライアントは日付 12:00 のリクエストを送信し、12:00 はデータベースに到達しますが、サーバーを返します 19:00 の時間を返します。誰が日付を台無しにしているかを確認するためにローカルでデバッグしようとしましたが、サーバーとクライアントで同じ日付を持っているため、矛盾はありません。

これはサーバーに送信されるパラメーターです &startDate=07/25/2012%2012:00:00

これが結果です: 1343232000000 - エポックからの秒数 (コンバーターを使用する場合 - http://www.epochconverter.com/ - 日付が実際には 2012 年 7 月 25 日水曜日 19:00:00 であることがわかります)

ここにいくつかのコードスニペットがあります:

public static void GetProfessionalsHours(List<long> ids, out List<SalonProfessional> professionals)
    {
        professionals = new List<SalonProfessional>();
        using (SqlConnection conn = new SqlConnection(DbConfig.ConnectionString))
        {
            using (
                SqlCommand command = new SqlCommand("GetProfessionalsHours", conn) { CommandType = CommandType.StoredProcedure })
            {
                conn.Open();
                command.Parameters.AddWithValue("professionalIDs", ids.CommaSeparated());
                using (IDataReader reader = command.ExecuteReader())
                {
                    //get normal schedule
                    while (reader.Read())
                    {
                        professionals.Add(SalonProfessional.GetSalonProfessional(reader));
                    }
                    reader.NextResult();
                    while (reader.Read())
                    {
                        professionals.Find(p => p.ID == reader.GetInt64(1)).Hours.Add(ProfessionalHours.GetProfessionalHour(reader));
                    }
                    //get overriden hours
                    reader.NextResult();
                    while (reader.Read())
                    {
                        professionals.Find(p => p.ID == reader.GetInt64(1)).OverriddenHours.Add(ProfessionalOverriddenHour.GetProfessionalOverriddenHour(reader));
                    }
                }
            }
        }
    }

public static ProfessionalOverriddenHour GetProfessionalOverriddenHour(IDataReader reader)
    {
        return new ProfessionalOverriddenHour()
                   {
                       ID = reader.GetInt64(0),
                       ProfessionalId = reader.GetInt64(1),
                       StartDate = reader.GetDateTime(2),
                       EndDate = reader.GetDateTime(3),
                   };
    }


public JsonResult CalendarData(List<long> professionalIDs, CalendarData calendarData)
    {
        AjaxResponse response = new AjaxResponse();
        response.Success = true;
        CalendarDataResponseObject responseData = new CalendarDataResponseObject();
        response.Content = responseData;

        try
        {
          List<SalonProfessional> professionals = null;
          CalendarOperations.GetProfessionalsHours(professionalIDs, out professionals);
          responseData.Professionals = professionals;

        }
        catch (Exception ex)
        {
            response.Success = true;
            response.ErrorMessage = "Could not retrieve calendar data";
            ExceptionsOperations.LogException(ex, "Could not retrieve calendar data");
        }

        return Json(response, JsonRequestBehavior.AllowGet);
    }

問題は、ProfessionalOverriddenHour オブジェクトの StartDate と EndDate にあります。

4

4 に答える 4

1

最初に UTC を参照して変換した後、日付文字列を格納および取得してみてください。

以下は Scott Hanselman のブログ投稿からの抜粋です。

別の言い方をすると、DateTime.Now を使用して日付を計算したり、何かを保存したりしないでください。DateTime.UTCNow を使用し、将来の日付を送信すると一部のメソッドが異常終了することに注意してください。DateTime をユーザーに表示する最後の 1 秒まで、現地時間で何もしないでください。

また、夏時間とタイム ゾーンのベスト プラクティスも確認してください。

于 2012-07-24T15:33:44.917 に答える
1

オフセット (z) を送信するか、UTC に同意することができます

    Console.WriteLine(DateTime.Now.ToString("hh mm ss z"));
    Console.WriteLine(DateTime.Now.ToUniversalTime().ToString());
于 2012-07-24T15:40:15.987 に答える
0

みんな助けてくれてありがとう!

問題は、サーバーとクライアントの両方が日付を現地時間に変換していたことです。したがって、解決策は、サーバーで時間差を取得し、それらを日付とJavaScriptに追加して、utc時間で動作させることでした。基本的に、タイムゾーンが必要ない場合は、どこでも UTC を使用してください。

于 2012-07-25T10:29:08.587 に答える
0

すでに提案されているように、日付を保存するときは常に UTC を使用し (データベース、ファイルなど)、その日付を表示するときに使用するタイムゾーンをクライアント自身に決定させます (そのときのみ!)。

もちろん、日付文字列にタイムゾーンデータを含めるだけで機能させることができますが、すべてがより複雑になります (私見)。ユーザーに表示しない限り、日付は常に UTC であるという単純なケースに固執します。

于 2012-07-24T16:57:16.903 に答える