如何解决根据 Current CultureInfo ASP.NET Core
我的应用服务器所在的位置与我的大多数应用用户当前所在的位置不同。
在存储日期时间值时,我意识到如果我只是这样做
`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 的位置
有没有办法让我的日期时间值按照 CurrentCultureInfo
类中设置的 startup.cs
存储在数据库 (sql Server) 中?
我目前只是将日期时间值存储为 UTC,并在从数据库中检索值后将其转换为等效的 UTC+1 值。
所以,我愿意
TimeAdded=DateTime.UtcNow;
TimeAdded=TimeAdded.AddHours(1)
谢谢
解决方法
有没有办法让我的日期时间值存储在数据库中 (SQL Server) 按照 CurrentCultureInfo?
日期时间在 SQL Server 中以二进制格式存储,没有任何文化信息。但是,SQL Server 可以存储带有时间偏移量的日期和时间信息。 SQL Server 具有 datetimeoffset 类型。我认为用文化信息存储日期并不能解决在用户本地时区显示日期和时间的问题,因为文化信息可以对应多个时区。例如,在西班牙,我们有两个时区,而美国有多个时区。
在检索到显示给用户的值后,我将其转换为
TimeAdded=TimeAdded.AddHours(1)
我希望有更好的方法 这是有的。
不要那样做,因为夏令时会发生什么?并且您假设您的所有用户都在同一时区。
我建议您将日期时间存储在 UTC 中,因为它没有歧义,它只有一种解释。然后您必须将该日期时间转换为用户时区的本地日期时间以进行显示。如果您知道用户所在的时区,您可以执行以下操作:
var usertimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneId);
var userLocalDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime,usertimeZoneInfo);
可以使用一些 JavaScript 计算出用户的 IANA 时区。此 answer 向您展示了如何做到这一点。
并且 IANA 时区可以转换为 windows 时区 ID。请参阅此answer。它会告诉你如何去做。
另一方面,如果您通过从浏览器调用某些 Web API 来获取数据。你真的不需要做太多。您只需要确保数据被序列化,因为它是 UTC 日期。是的,您将 UTC 日期存储在数据库中,但是当您从数据库中检索它们时,您会得到 DateTimeKind.Unspecified
日期,然后这些日期没有正确序列化为 JSON。如果使用Newtosoft.Json 进行序列化,可以指定SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc
如果您使用 System.Text.Json,则必须为 JsonConverter
编写自定义 DateTime
。
这里有一个 JsonConverter
用于序列化 DateTimeKind.Unspecified
日期,因为它们是 UTC:
public class JsonDateConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader,Type typeToConvert,JsonSerializerOptions options)
{
var d = reader.GetDateTime();
return d;
}
public override void Write(Utf8JsonWriter writer,DateTime value,JsonSerializerOptions options)
{
if (value.Kind == DateTimeKind.Unspecified)
{
value = new DateTime(value.Ticks,DateTimeKind.Utc);
}
writer.WriteStringValue(value);
}
}
然后在从 Web API 检索数据后立即编写一些 Javascript 来解析日期:
obj.theDate = obj.TheDate && new Date(obj.TheDate);
您需要这样做,因为在序列化为 JSON 时,DateTime
被序列化为字符串。并且您希望 theDate
成为 JavaScript 日期。
之后,theDate 是用户时区本地时间日期。要检查它,请编写以下内容:
console.log(obj.theDate);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。