C# 从SQL在网站上显示时间

C# 从SQL在网站上显示时间,c#,sql,asp.net-mvc,datetime,C#,Sql,Asp.net Mvc,Datetime,我就是找不到答案,所以我发了这篇文章。我希望存储在SQL数据库中的时间在我的网站上显示为数据库中的确切时间。目前,情况并非如此。显示的时间正在转换为浏览计算机的本地时间。由于保存的时间是预约时间,因此无论浏览计算机位于何处或哪个时区,将其转换都没有意义。我以为TimeZone和TimeZoneInfo是用来将时间转换成本地时间的,但这似乎是自动发生的。我如何将保存的确切时间显示在我的网站上 SQL数据库字段ETAStart和ETAEnd定义为datetime 数据库更新在控制器中按如下方式处理:

我就是找不到答案,所以我发了这篇文章。我希望存储在SQL数据库中的时间在我的网站上显示为数据库中的确切时间。目前,情况并非如此。显示的时间正在转换为浏览计算机的本地时间。由于保存的时间是预约时间,因此无论浏览计算机位于何处或哪个时区,将其转换都没有意义。我以为TimeZone和TimeZoneInfo是用来将时间转换成本地时间的,但这似乎是自动发生的。我如何将保存的确切时间显示在我的网站上

SQL数据库字段ETAStart和ETAEnd定义为datetime

数据库更新在控制器中按如下方式处理:

if (TryUpdateModel(model)) {

    System.DateTime ETAEnd = Convert.ToDateTime(model.ETAStart).AddHours(3);

    model.ETAEnd = ETAEnd;
    model.UpdatedBy = CurrentUser();

    model.UpdateDate = Convert.ToDateTime(DateTime.Now.ToString("U"));


    dc.SubmitChanges();


    return View(new GridModel<ManifestMasterModel> { Data = GetMMList(0) });

} else {
    return View();
}
if(TryUpdateModel(model)){
System.DateTime etaind=Convert.ToDateTime(model.ETAStart).AddHours(3);
model.etaind=etaind;
model.UpdatedBy=CurrentUser();
model.UpdateDate=Convert.ToDateTime(DateTime.Now.ToString(“U”));
dc.提交更改();
返回视图(新GridModel{Data=GetMMList(0)});
}否则{
返回视图();
}

提前感谢您,我非常感谢所有回复者。

您是否检查了服务器上设置的时区?这发生在我几天前,结果证明托管服务器有不同的时区

以下是检查的方法:

Response.Write(TimeZoneInfo.Local.DisplayName)
编辑1:

您可以使用Utc时间将其转换为您想要的时区。见:

TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"));

您是否尝试使用以下命令将日期时间存储为UTC:

model.UpdateDate = Convert.ToDateTime(DateTime.Now.ToString("U"));
您可以这样使用它来不进行转换:

model.UpdateDate = DateTime.Now.ToUniversalTime();

我不完全确定我是否理解问题所在,但我觉得您需要实现自定义modelbinder

这些资源可能会帮助您:


尽管如此,我认为仅仅使用字符串的快速修复建议没有任何问题(我认为你会帮自己一个忙)。这听起来像是在试图让客户机和MVC忽略处理日期的时区含义,这可能需要做更多的工作,而且比仅仅使用字符串方法要简单得多。数据库中仍然可以有一个DateTime,只需将用户提交的字符串值拉出来,并使用适当的时区将其解析为DateTime。

web服务器和SQL服务器上的时区是我想要的,并且是相同的。从具有不同时区的其他服务器访问该站点会暴露出我概述的问题。没有办法确定客户端时区。所以问题是另外一回事。请参见编辑1.Charandeep,谢谢您的回复。不过,我尝试过使用时区和时区信息,并将时间设置为“山区标准时间”;这个时区的某些部分使用日光节约,而其他部分则不使用。没有一致性。我希望有一种方法可以在db中显示时间,而不进行任何转换。我最终要做的是确定时间被转换成什么,然后计算一种方法将其转换回数据库中存储的时间。我知道还有其他方法,比如isDayLightSave和GMTOffset,但为什么呢?我只需要db值。为什么你想把它转换回来,只需要存储一次你需要的东西并使用它?这就是整个问题。。。保存到数据库的时间是正确的,检索和显示的时间将自动转换为浏览计算机时区。Nesim,这只是数据库中用于确定上次更新时间的字段。使用“U”格式将日期返回为“2012年6月16日星期一上午4:15:07”。这不是我遇到问题的字段。使用“U”格式会返回您提到的日期,但我不明白的是,您正在将其再次转换为DateTime,而您正在丢失格式。这两行给出的结果与我在回答中所写的相同。对于您的实际问题,您能否说明如何从数据库中获取日期并尝试显示?//ETAStart=TimeZoneInfo.ConvertTimeToUtc(Convert.ToDateTime(e.ETAStart),tz),//etand=TimeZoneInfo.ConvertTimeToUtc(Convert.ToDateTime(e.etaind),tz),//ETAStart=zone.ToLocalTime(Convert.ToDateTime(e.ETAStart)),//ETAEnd=zone.ToLocalTime(Convert.ToDateTime(e.ETAEnd)),//ETAStart=DateTime.SpecifyKind(Convert.ToDateTime(e.ETAEnd)),//ETAEnd=DateTime.SpecifyKind(Convert.ToDateTime(e.ETAEnd),DateTimeKind.Unspecified),ETAStart=Convert.ToDateTime(e.ETAStart),ETAEnd=Convert.ToDateTime(e.ETAEnd),失败的尝试注释请不要误解我,如果没有更多的输入,很难找到解决方案,所以我在问;您知道当您使用“U”格式时,您将本地时间存储为UTC时间,这意味着,如果您在GMT+2上,并且您的本地时间为14:00,您的日期将保存为12:00。Shaun,问题是不应转换约会时间。如果在加利福尼亚州为犹他州的客户创建了上午9点的预约时间,并且在犹他州查看了该网站,则该预约时间应显示为上午9点,但已转换为上午8点。我在这个主题上看到的所有引用都是指在客户端的时区中显示日期和时间。我真的只想把时间保存在数据库里。对不起,我看错了。所以澄清一下,您的数据库中有上午9点,并且无法渲染上午9点?我看不出有什么理由这样。你能粘贴你用来将日期呈现为html的代码吗?和我对Nesim的评论一样。。。(e是数据上下文)ETAStart=Convert.ToDateTime(e.ETAStart),ETAEnd=Convert.ToDateTime(e.ETAEnd)。。。在视图中,时间是使用客户端的时区显示的。不知道这意味着什么。什么是e.ETAStart?如果不是,为什么必须将其转换为日期时间?如果数据库中有上午9点,并且您正在从数据库中提取该数据并将其呈现给客户端,那么