如何处理时区差异
本文关键字:时区 处理 何处理 | 更新日期: 2023-09-27 18:00:16
我有一个使用BST时区(UTC+1)的应用程序和另一个使用上述指定应用程序值的应用程序。在我的第二台服务器上,时区是UTC。正因为如此,当我在datetime属性中获取值时,会有一个小时的差值,因此值会出错。我无法调整两台服务器上的时区。如何在我的第二个应用程序中使用.net.将值转换为BST时区
public DateTime? EmploymentStartDate { get; set; }
这是我模型中的财产。
第一台服务器的值为2001年8月29日00:00:00,而第二台服务器的时区为UTC,则为2001年9月28日23:00:00。
很简单,您必须考虑所有DateTime始终在UTC中,所以只需调用ToUniversalTime()即可转换UTC时区中的每个实例:
DateTime dt = DateTime.Now;
dt.ToUniversalTime();
我同意Daniel A.White的观点。您应该将所有内容存储为UTC
,并将日期转换为客户端上的本地日期。
看这个https://msdn.microsoft.com/en-us/en-en/library/system.timezoneinfo.converttimefromutc(v=vs.100).aspx
private DateTime? _employmentStartDate;
public DateTime? EmploymentStartDate
{
get
{
return _employmentStartDate != null ? TimeZoneInfo.ConvertTimeFromUtc(_employmentStartDate.Value, TimeZoneInfo.Local) : new DateTime();
}
set
{
_employmentStartDate = TimeZoneInfo.ConvertTimeToUtc((DateTime)value);
}
}
另请参阅上一篇StackOverflow文章:
MySQL是否应该将其时区设置为UTC?
本文(以及它链接到的许多其他文章和网页)讨论了MySQL,但其关注点和技术对于任何数据库和编程语言都是相似的。
虽然您(OP)的问题似乎是关于如何在时区之间转换时间信息,但评论中关于选择存储格式的讨论越来越激烈。首先,要将UTC时间转换为BST,您可以使用TimeZoneInfo.ConvertTimeFromUtc。这种方法"将协调世界时(UTC)转换为指定时区的时间。"
这里有一个例子:
var bstZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Daylight Time");
bstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, bstZone);
NB 1:如果在执行时,您真正想要的是服务器上的本地时间,那么显然您应该使用ToLocalTime()
,如果该本地时间恰好是BST(并且DateTime
变量的Kind
属性不是DateTimeKind.Local
),则会产生相同的结果。
NB 2:据我所知,TimeZoneInfo
类将"英国夏令时"称为"GMT夏令时",我想这就是你所说的BST。但不要相信我的话,你需要确保自己有正确的时区ID。
现在,关于存储:
TL;DR
没有时区信息的时间签名是不可靠的信息。然而,在这个前提下,没有真正的"对错"时区可用于存储。虽然大多数人可能会认为UTC是一种最佳实践,但首先,信息(以UTC表示)仍应与时间戳一起明确存储,其次,在特定情况下,可能有其他格式更可取的实际原因。
在对时间值执行算术计算时,应使用通用时间表示法,以避免在夏令时等方面出现问题。
请厌倦序列化和反序列化机制对您提供的信息(例如System.XML.Serialization
或数据库引擎)做出错误假设可能带来的复杂性。
显然,在显示时间信息时(也就是说,在创建适合人类解释的字符串表示时),应该以用户期望的任何格式进行显示。无论你如何坚持你的价值观,转换(带偏移)可能是必要的
查看这些链接了解更多信息:
- 在时区之间转换时间
- 在.NET框架中使用DateTime编码最佳实践