如何处理时区差异

本文关键字:时区 处理 何处理 | 更新日期: 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编码最佳实践