datetime . tuniversaltime()在asp.net应用程序中被忽略
本文关键字:应用程序 net asp tuniversaltime datetime | 更新日期: 2023-09-27 18:16:46
我正在开发一个ASP。. NET MVC应用程序,我在数据库中存储一个DateTime
对象。
服务器位于德国,我来自丹麦。日志含义设置web服务器运行UTC时间。
当我在数据库中保存DateTime
对象时,我将其存储为本地时间,如下所示:
PeriodEndDate = billingTaskForm.PeriodEndDate.ToLocalTime()
我甚至试图将其设置为.ToUniversalTime()
,看看它是否会被存储为21:59
,而不是这样。
数据库中PeriodEndDate
的值现在是2015-10-08 23:59
。
现在,在运行的线程中,我指定线程文化为丹麦语,如下所示:
Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK", false);
(使用PeriodEndDate
日期的方法在它自己的线程中运行,与UI分开,因为它是一个异步的,长时间运行的任务)
在后面的代码中,我使用PeriodEndDate
来过滤一些合约,如下所示:
var contracts = firm.Contracts.Where(x => x.EndDate == null || x.EndDate >= periodEndDate.ToUniversalTime());
合约以UTC日期存储在数据库中,这意味着合约结束日期存储为21:59
,因此我需要将该日期与我的PeriodEndDate
匹配,但作为UTC,因此我进行了.ToUniversalTime()
调用。
然而,查看日志,.ToUniversalTime()
调用似乎以某种方式被"忽略",因为PeriodEndDate
变量是23:59
,即使我做了.ToUniversalTime()
转换。如果我没弄错的话,应该是21:59
吧?
有人知道为什么没有转换吗?
DateTime
对象上的ToLocalTime
和ToUniversalTime
方法用于在UTC和运行代码的计算机的本地时区之间进行转换。它们不属于ASP。网络应用程序。DateTime.Now
也没有。
许多服务器都遵循将其时区设置为UTC的最佳实践,因此在这些环境中,除了更改.Kind
元数据属性外,您将看不到任何区别。
通常,在服务器端环境中,如ASP。Net中,您不应该依赖于服务器的本地时区来做任何特别的事情。相反,您应该使用TimeZoneInfo
类在UTC和特定的时区之间进行转换。例如:
string tzid = "Romance Standard Time"; // for Denmark
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(tzid);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(localTime, tz);
同时,重要的是要理解时区和文化是两个不同的东西。
尝试c#中的DateTimeOffset和数据库中的DateTime2