sql-server,C#,Datetime,Utc,Datetime Conversion,sql Server" /> sql-server,C#,Datetime,Utc,Datetime Conversion,sql Server" />

C# 在已发布站点上以db保存时,从LocalTime到UTC的日期时间转换问题

C# 在已发布站点上以db保存时,从LocalTime到UTC的日期时间转换问题,c#,datetime,utc,datetime-conversion,sql-server,C#,Datetime,Utc,Datetime Conversion,sql Server,我正在尝试将DateTime保存到数据库中 当我从服务器计算机运行代码并将日期保存到数据库时,它会正确地保存日期时间,但当我将站点部署到生产环境时,从本地计算机访问它,并尝试保存相同的日期时间,然后它会将其更改为不同的日期和时间。我想这可能是因为我的机器和服务器机器上的时区不同 我尝试将datetime转换为UTC,但它不起作用: DateTime OnlyStartDate = Convert.ToDateTime(app_date); DateTime NewStartDateTime =

我正在尝试将
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的查询,它将错误的时间保存到数据库:

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);

使用
DateTime
s很棘手,您应该遵循一些规则来确保系统按预期运行

  • 始终传输日期时间的UTC值
  • 如果使用字符串表示法对实例进行序列化,则始终使用符号传输
    DateTime
    的值。使用
    json
    或URL中的查询字符串发送
    DateTime
    ,都是应该这样做的示例
  • 始终使用UTC值存储
    DateTime
    实例
  • 始终在持久性存储中使用本机类型存储
    DateTime
    实例(永远不要作为字符串)
  • 当从客户端发送
    DateTime
    值时,只要客户端“知道”相关时区,就应尽早将其转换为UTC值
  • 当从服务器向客户端发送
    DateTime
    值时,在客户端“知道”其相关时区的情况下,尽可能晚地将其转换为本地时区
  • 在调用堆栈中尽可能晚地将
    DateTime
    值转换为字符串(从
    DateTime
    类型)时(即,这是一个表示层问题,最好由客户端处理)
  • DateTime
    值从客户端发送回服务器时,请尽早转换为
    DateTime
    类型
  • 创建ado.net命令/查询时(无论底层提供程序如何),始终对所有值和参数中的参数使用参数:
    • 指定匹配的Db值类型
    • 指定本机值(不是字符串表示)
    • 有关使用的特定示例,请参见

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

在约旦时区中显示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日期时间。

欢迎使用堆栈溢出。我强烈建议您首先使用参数化SQL。这将避免转换问题和SQL注入攻击,并使代码更具可读性。我还建议您尽可能少地在字符串和日期/时间值之间进行转换。“不工作”本身并没有帮助。你这是什么意思?你有错误吗?例外?意外的结果?并且不要将日期时间值存储为字符串。准确地存储它们。阅读:我同意@DaisyShipton。并且,您希望将其作为DateTime类型一直保留到SQL查询条目。也请查看。。。谢谢@DaisyShipton谢谢你的建议,但是我写了整个应用程序,我只是在其中做了一个小小的调整,关于日期时间转换问题,我一直在关注这个问题。你不需要重写整个应用程序,仅仅是为了使用SQL参数来实现这一点——尽管如果到处都是这样的话,你可能应该提出这个问题。(虽然您没有告诉我们数据库中列的类型,但这对我们没有帮助。)