【问题标题】:How to represent datetime of different time zones in C#如何在 C# 中表示不同时区的日期时间
【发布时间】:2011-03-04 20:30:22
【问题描述】:

我有一个 .NET WebService(用 C# 编写),它应该为世界各地的人们服务。
对于每个请求,我都会在他自己的时区获取用户的日期时间,格式为:yyyy/MM/dd HH:mm ZZZZ
我必须将字符串转换为代表 original 日期和时间并指定 GMT 时区的内容。我必须进行一些逻辑计算并将其保存在数据库中。

常规的 DateTime 不支持这一点。它没有指定时区的属性。当我尝试将字符串转换为 DateTime 时 - 它只是将其转换为我的本地时间。

我确实希望将我的时间保持在 UTC,因为我有一些逻辑必须在每个用户自己的时间运行。

有人知道处理这个问题的 C# 类吗?

【问题讨论】:

    标签: c# datetime timezone


    【解决方案1】:

    不清楚 ZZZZ 是指偏移量(不是完整的时区信息)还是时区名称。这很重要,因为偏移量会随着时间而变化,通常是由于夏令时。

    如果它只是一个偏移量,那么来自 .NET 2.0SP1 的 DateTimeOffset 将涵盖您需要的所有内容(但由于信息不完整,您必须小心)。

    如果是实时时区名称,来自 .NET 3.5 的TimeZoneInfo可能会帮助您 - 取决于名称的格式。它使用 Windows 名称(例如“GMT 标准时间”)而不是更常见的 zoneinfo 名称(例如“Europe/London”)。您需要将DateTime 或(最好)DateTimeOffsetTimeZoneInfo 一起存储。

    在未来,Noda Time 应该能够更轻松地为您做到这一点 - 但它还没有准备好投入生产。

    【讨论】:

    • 对不起,我还得再问一些。如果我得到“2009/01/10 17:18:44 -0800”,我该如何解析它以获取时区信息和分开约会?我必须自己剪切字符串并解析它还是有内置的方法来处理这个?
    • @Mohoch:Hans 已经为您提供了解析代码,但您需要注意这不是完整的时区信息。这只是那个时间点的正确偏移量。同一时区可能在一年中的不同时间有不同的偏移量。
    • 谢谢乔恩。我对位置的时区偏移不感兴趣,只对用户的当前偏移感兴趣。但如果范围发生变化,我会记住这一点。非常感谢。
    【解决方案2】:

    你可以用 DateTimeOffset 来解析它。例如:

    using System;
    
    class Program {
        static void Main(string[] args) {
            var s = "2009/01/10 17:18:44 -0800";
            var dto = DateTimeOffset.ParseExact(s, "yyyy/MM/dd HH:mm:ss zzzz", null);
            var utc = dto.UtcDateTime;
            Console.WriteLine(utc);
            Console.ReadLine();
        }
    }
    

    输出:2009 年 1 月 11 日上午 1:18:44

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2022-06-14
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多