从C#搜索SQL Server时出现时区问题

时间:2018-02-27 19:26:40

标签: c# sql-server

我有一个搜索模型,它将日期范围发送到存储过程。存储过程返回结果。这在我在中部时间的地方工作正常。

但是我们在印度有用户,他们可以输入有效的日期,比如说' 08/15/2017 23:00'在他们的表格中,日期为' 08/14/2017'所以他们没有得到任何返回的数据。

如果他们在08/14/2017输入,则会收到错误的数据。数据从2017年8月13日

如何在将c#发送到存储过程之前解决c#中的时区问题?

我试过这个没有运气

public DateTime AdjustForTimezone(DateTime date)
{
    TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName);
    var newDate = TimeZoneInfo.ConvertTimeToUtc(date);
    return newDate;
}

SqlCommand cmd = new SqlCommand("getTableData", connection);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(cmd);           
cmd.Parameters[1].Value = AdjustForTimezone(dateModel.FromDate);
cmd.Parameters[2].Value = AdjustForTimezone(dateModel.toDate);

1 个答案:

答案 0 :(得分:2)

客户端到服务器

客户端应将日期时间实例发送到服务器,其值为UTC或当前与UTC的偏移量。

数据库应将DateTime(或DateTimeOffset)保留为DateTime/2(或使用DateTimeOffset)。

服务器到客户端

服务器应使用UTC值(或与UTC的偏移量)将日期时间信息发送到客户端。客户有责任在呈现日期时间时应用客户端所需的偏移量(即尽可能晚地在表示层中进行)。

序列化

如果必须序列化日期时间,请使用ISO8601表示法。

通过应用上述规则,您现在已将日期时间值存储为可比较且明确的方式。现在可以对它们进行过滤,排序等。

如果您要过滤,请务必从客户端获取日期时间过滤器参数并应用相同的规则。在美国东部时区搜索2017-02-06日期的记录,应将其转换为日期范围介于2017-02-06T05:00:002017-02-07T05:00:00之间的记录,因为该时区为UTC-05:00 at那个时间点。

附注

  • 规则存在例外情况,例如存储出生日期。
  • 我个人更喜欢在代码和数据存储中将DateTime/2作为UTC DateTimeOffset存储。