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 的最后一秒。

另请查看夏令时和时区最佳实践

于 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

就像已经建议的那样,在存储日期(在数据库、文件等中)时始终使用 UTC,并让客户端自己决定在显示该日期时应该使用哪个时区(只有那时!)

您当然可以通过在日期字符串中包含时区数据来使其工作,但这会使一切变得更加复杂(恕我直言),坚持日期始终为 UTC 的简单情况,除非您将其显示给用户。

于 2012-07-24T16:57:16.903 回答
0

非常感谢大家的帮助!

问题是服务器和客户端都将日期转换为本地时间。所以解决方案是获取服务器上的小时差异并将它们添加到日期和javascript上以使用UTC时间。基本上,当您不需要时区时,请在任何地方使用 UTC。

于 2012-07-25T10:29:08.587 回答