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

C# 从C搜索SQL Server时出现时区问题#,c#,sql-server,C#,Sql Server,我有一个搜索模型,它向存储过程发送一个日期范围。存储过程返回结果。这在我在中央时间的地方很好用 然而,我们在印度有用户,他们可以输入有效日期,比如'08/15/2017 23:00',在表格中,他们的日期是'08/14/2017',因此他们不会返回任何数据 如果他们输入2017年8月14日,他们会得到错误的数据。2017年8月13日的数据 在将时区问题发送到存储过程之前,如何解决它 我试过了,但运气不好 public DateTime AdjustForTimezone(DateTime dat

我有一个搜索模型,它向存储过程发送一个日期范围。存储过程返回结果。这在我在中央时间的地方很好用

然而,我们在印度有用户,他们可以输入有效日期,比如'08/15/2017 23:00',在表格中,他们的日期是'08/14/2017',因此他们不会返回任何数据

如果他们输入2017年8月14日,他们会得到错误的数据。2017年8月13日的数据

在将时区问题发送到存储过程之前,如何解决它

我试过了,但运气不好

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);
客户端到服务器 客户端应使用
UTC
值或当前UTC偏移量向服务器发送日期时间实例

数据库应将(或)持久化为(或使用)

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

系列化 如果必须序列化日期时间,请使用符号


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

如果要筛选,请确保从客户端获取日期-时间筛选器参数并应用相同的规则。在美国东部时区搜索日期
2017-02-06
的记录应转换为日期范围在
2017-02-06T05:00:00
2017-02-07T05:00:00
之间的记录,因为该时区是UTC−05:00在那个时间点


旁注

  • 这条规则也有例外,比如存储出生日期
  • 就个人而言,我更喜欢以UTC的形式存储,而不是在代码和数据存储中
客户端到服务器 客户端应使用
UTC
值或当前UTC偏移量向服务器发送日期时间实例

数据库应将(或)持久化为(或使用)

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

系列化 如果必须序列化日期时间,请使用符号


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

如果要筛选,请确保从客户端获取日期-时间筛选器参数并应用相同的规则。在美国东部时区搜索日期
2017-02-06
的记录应转换为日期范围在
2017-02-06T05:00:00
2017-02-07T05:00:00
之间的记录,因为该时区是UTC−05:00在那个时间点


旁注

  • 这条规则也有例外,比如存储出生日期
  • 就个人而言,我更喜欢以UTC的形式存储,而不是在代码和数据存储中

DB应将时间存储为UTC,C#应在执行之前将输入的所有时间转换为UTC。客户端应将日期时间实例发送到服务器,以UTC或UTC的当前偏移量。数据库应将日期时间持久化为UTC或使用DateTimeOffset,并使用偏移量将其持久化。就个人而言,我更喜欢将DateTime/2存储为UTC而不是DateTimeOffset。DB应将时间存储为UTC,C#应在执行之前将输入的所有时间转换为UTC。客户端应将DateTime实例发送到服务器,作为UTC或使用当前的UTC偏移量。数据库应将日期时间持久化为UTC或使用DateTimeOffset,并使用偏移量将其持久化。就个人而言,我更喜欢将DateTime/2存储为UTC而不是DateTimeOffset。