DateTime转换问题从LocalTime转换为UTC,同时在已发布站点上的db中保存

时间:2018-04-18 19:57:43

标签: c# datetime utc datetime-conversion

我正在尝试将DateTime保存到数据库中。

当我从服务器计算机运行代码并将日期保存到数据库时,它会正确保存DateTime,但是当我将网站部署到生产环境时,从本地计算机访问它,并尝试保存相同的DateTime,然后将其更改为不同的日期和时间。我想这可能是由于我的机器和服务器机器上的时区不同。

我尝试将日期时间转换为UTC但不起作用:

DateTime OnlyStartDate = Convert.ToDateTime(app_date);
DateTime NewStartDateTime = Convert.ToDateTime(
    OnlyStartDate.Add(TimeSpan.Parse(appData.start.ToString("HH:mm:ss"))));         
startTime = Convert.ToString(NewStartDateTime);

这是传递变量startTime的查询,它将错误的时间保存到db:

query = "Insert into [Appointments] Values('" + loc_id + "', '" + appData.titleId + 
    "', '" + patiant_id + "', '" + app_date + "', '" + startTime + "', '" + endTime + 
    "', '" + appData.providerId + "', 'enable', 'False', '" + userEmail + "', '" + 
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '" + userEmail + "', '" + 
    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '" + 
    appData.statusId + "', '" + appData.userId + "','')";

DB.executeQuery(query);

2 个答案:

答案 0 :(得分:0)

使用DateTime是很棘手的,您应该遵循规则以确保系统按预期运行。

  • 始终传输DateTime
  • 的UTC值
  • 如果使用字符串表示形式发生实例的序列化,则始终使用ISO8601表示法传输DateTime的值。使用DateTime或在URL中的查询字符串中发送json都是应该这样做的示例。
  • 始终使用UTC值存储DateTime实例。
  • 始终在持久性存储中使用本机类型存储DateTime实例(从不作为字符串)。
  • 当客户端发送DateTime值时,尽早转换为UTC值,因为客户端知道"关于它的相关时区。
  • 当从服务器向客户端发送DateTime值时,在客户端上尽可能晚地转换为本地时区,因为客户端"知道"关于它的相关时区。
  • 在调用堆栈中尽可能晚地显示DateTime值转换为字符串(来自DateTime类型)(即,它是客户端最佳处理的表示层关注点)。 / LI>
  • 从客户端向服务器发送DateTime值时,请尽早转换为DateTime类型。
  • 创建ado.net命令/查询时(无论基础提供程序如何)始终使用所有值和参数中的参数:

答案 1 :(得分:0)

将数据保存到db时使用DateTime.UtcNow,在显示时将其转换为要显示日期时间的时区,这是最初的主要做法。

在约旦时区显示UTC日期时间的示例:

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Jordan Standard Time");
string CreatedDate = TimeZoneInfo.ConvertTimeFromUtc(model.CreatedDate, timeZoneInfo).ToString("d/M/yyyy HH:mm:ss")

model.CreatedDate是来自db的UTC日期时间。