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

3
我有一个.NET WebService(用C#编写),它应该为全球的用户提供服务。
在每个请求中,我会得到用户自己所在时区的日期时间,格式为:yyyy/MM/dd HH:mm ZZZZ
我需要将字符串转换为代表原始日期和时间并指定GMT时区的内容。我需要进行一些逻辑计算并将其保存在数据库中。

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

不想保留我的时间为UTC,因为我有一些逻辑需要根据用户的时间运行。

是否有人知道处理此问题的C#类?

2个回答

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();
    }
}

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


2
这段话的意思是:不清楚ZZZZ是否只是一个偏移量(这并不是完整的时区信息),还是一个时区名称。这很重要,因为偏移量通常会随着夏令时的更改而变化。
如果只是偏移量,则.NET 2.0SP1中的DateTimeOffset可以满足您的所有需求(但由于信息不完整,您必须小心)。
如果是真正的时区名称,则.NET 3.5中的TimeZoneInfo可能会帮助您,具体取决于名称的格式。它使用Windows名称(例如“GMT标准时间”),而不是更常见的zoneinfo名称(例如“Europe/London”)。您需要存储DateTime或(最好是)DateTimeOffset以及TimeZoneInfo
将来,Noda Time应该能够更轻松地为您完成此操作 - 但它目前还没有准备好用于生产。

抱歉,但我还需要再问一些问题。如果我获得了“2009/01/10 17:18:44 -0800”这个字符串,如何将其解析以单独获取时区信息和日期?我需要手动截取字符串并进行解析吗,还是有内置方法可以处理这个问题? - Mohoch
@Mohoch:Hans 给了你解析代码,但你需要知道那并不是完整的时区信息。它只是在那个时间点上的正确偏移量。同一个时区在一年中的不同时间可能会有不同的偏移量。 - Jon Skeet
谢谢Jon。我对位置的时区偏移不感兴趣,只关注用户当前的偏移量。但如果范围发生变化,我会记住这一点。非常感谢。 - Mohoch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接