我有一个搜索模型,它将日期范围发送到存储过程。存储过程返回结果。这在我在中部时间的地方工作正常。
但是我们在印度有用户,他们可以输入有效的日期,比如说' 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);
答案 0 :(得分:2)
客户端应将日期时间实例发送到服务器,其值为UTC
或当前与UTC的偏移量。
数据库应将DateTime(或DateTimeOffset)保留为DateTime/2(或使用DateTimeOffset)。
服务器应使用UTC值(或与UTC的偏移量)将日期时间信息发送到客户端。客户有责任在呈现日期时间时应用客户端所需的偏移量(即尽可能晚地在表示层中进行)。
如果必须序列化日期时间,请使用ISO8601表示法。
通过应用上述规则,您现在已将日期时间值存储为可比较且明确的方式。现在可以对它们进行过滤,排序等。
如果您要过滤,请务必从客户端获取日期时间过滤器参数并应用相同的规则。在美国东部时区搜索2017-02-06
日期的记录,应将其转换为日期范围介于2017-02-06T05:00:00
和2017-02-07T05:00:00
之间的记录,因为该时区为UTC-05:00 at那个时间点。
附注