如何在C#中表示不同时区的日期时间

时间:2010-06-17 08:28:54

标签: c# datetime timezone

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

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

希望在UTC中保持时间,因为我有一些逻辑必须按用户自己的时间运行。

有没有人知道处理这个的C#类?

2 个答案:

答案 0 :(得分:3)

您可以使用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();
    }
}

输出:1/11/2009 1:18:44 AM

答案 1 :(得分:2)

目前尚不清楚ZZZZ是否只是一个偏移(不是完整的时区信息)或时区的名称。这很重要,因为偏移量会随着时间的推移而变化,通常是由于夏令时。

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

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

将来,Noda Time应该能够更轻松地为您做到这一点 - 但它尚未准备好进行生产。