【发布时间】:2021-04-04 00:47:30
【问题描述】:
我的应用程序服务器与我的大多数应用程序用户当前所在的位置不同。
在存储日期时间值时,我意识到如果我只是这样做
`TimeAdded=DateTime.Now`,
无论我在Startup.cs 课程中是否执行了以下操作,都会根据服务器位置时间存储时间
var cultureInfo = new CultureInfo("en-NG");
cultureInfo.NumberFormat.CurrencySymbol = "NGN";
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
我的用户的位置在 UTC+1,而服务器当前位于 UTC-8 的位置
有没有办法根据startup.cs 类中设置的CurrentCultureInfo 将我的日期时间值存储在数据库(SQL Server)中?
我目前仅将日期时间值存储为 UTC,并在从数据库中检索值后将其转换为等效的 UTC+1 值。
所以,我愿意
TimeAdded=DateTime.UtcNow;
在检索到显示给用户的值后,我将其转换为
TimeAdded=TimeAdded.AddHours(1)
我希望找到更好的方法来解决这个问题。
谢谢
【问题讨论】:
-
没有。在机器之间传输 DateTime 时,标准是使用 UTC 保存。 Datetime 是一个使用 UTC 的数字。当您将字符串转换为/从 DateTime 转换时,本地计算机使用文化(时区)自动转换为 UTC。所以你看到的是使用机器时区显示的日期。使用当前机器时区自动存储日期。如果您要存储来自另一个时区的日期,则字符串必须包含时区,或者您必须指定时区。
-
您可以更改整个服务器的时区,使其与用户之一一致。这是唯一的方法。您无法更改单个应用的时区(例如,请参阅 stackoverflow.com/questions/8589014/…)
-
不是将 DateTime 数据存储为 UTC,另一种方法是在 .NET 和 T-SQL 中使用
DateTimeOffset类型。这样,您就不必担心文化或日期数学(例如DateTimeOffset.Now)。 -
@jdweng,我目前将日期存储为 UTC。但是您提到我可以在存储日期时包含或指定日期,您能否提供一个指向资源的链接,我可以在其中找到如何执行此操作?
-
@Josh 不,我从未使用过它。我知道它的存在,但这只是因为我读了很多书。我认为使用起来并不复杂。例如:
DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(-8))将生成一个偏移量为 -8 的Now...您应该将 DateTime 的生成集中在某个方法中(public static DateTimeOffset Now() { return DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(-8)); },这样就不会有人忘记使用它。取决于您的程序如何是写的(如果你有所有页面的基本页面),你可以把它放在那里
标签: c# sql-server asp.net-core-mvc cultureinfo currentuiculture