TimeZoneInfo | GetUtcOffset:更好的解决方案?

时间:2010-10-25 18:40:11

标签: c# datetime timezone

我遇到的问题是我的服务器需要GMT格式的日期时间对象,我的UI应用程序总是根据本地文化创建和操作所有日期时间对象。我不能改变文化,因为还有其他功能需要datetime对象按照当地的格式。我已经为此编写了一个转换器,不确定是否有任何现成的api允许我这样做。对于timezoneinfo上的GetUtcOffset方法有点困惑,它是否给出了本地时间和gmt时间之间的差异?我试过了在msdn上可用的文档,对我来说有点麻烦。请问你能帮忙吗?我如何通过改变文化和验证输出对它进行单元测试?

以下类将日期时间对象转换为包含等效的GMT时间,并在从服务器接收时将其转换回来。

注意:我的服务器和UI都在CET时间运行,但是这些日期时间对象是特定于英国的,因此服务器在GMT中需要它们。

public class GmtConverter : IDateConverter
    {
        private readonly TimeZoneInfo timeZoneInfo;

        public GmtConverter()
            : this(TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"))
        {

        }
        public GmtConverter(TimeZoneInfo timeZoneInfo)
        {
            this.timeZoneInfo = timeZoneInfo;
        }

        public DateTime Convert(DateTime localDate)
        {
            var utcOffset = timeZoneInfo.GetUtcOffset(localDate);

            var unSpecified = localDate + utcOffset;

            return DateTime.SpecifyKind(unSpecified, DateTimeKind.Unspecified);  
        }

        public DateTime ConvertBack(object local)
        {
            var localDate = (DateTime) local;

            var utcOffset = timeZoneInfo.GetUtcOffset(localDate);

            var unSpecified = localDate - utcOffset;

            return DateTime.SpecifyKind(unSpecified, DateTimeKind.Unspecified);            
        }
    }

1 个答案:

答案 0 :(得分:0)

当你说GMT时,你的意思是UTC吗?来自Wikipedia

  

在临时使用中,当分数为a   第二个并不重要,格林威治   可以考虑平均时间(GMT)   相当于UTC或UT1。说“GMT”   通常暗示UTC或UT1时   用于非正式或休闲   上下文。在技​​术背景下,用法   避免“GMT”;毫不含糊   术语“UTC”或“UT1”是   优选的。

如果是这样,问题就解决了: