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