我有一个.NET WebService(用C#编写),应该为世界各地的人们提供服务
对于每个请求,我在其自己的时区中获取用户的日期时间,格式为:yyyy/MM/dd HH:mm ZZZZ
我必须将字符串转换为代表原始日期和时间的字符串,并在GMT中指定时区。我必须进行一些逻辑计算并将其保存在数据库中。
常规DateTime doe不支持此功能。它没有指定时区的属性。当我尝试将我的字符串转换为DateTime时 - 它只是将其转换为我当地的时间。
我不希望在UTC中保持时间,因为我有一些逻辑必须按用户自己的时间运行。
有没有人知道处理这个的C#类?
答案 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
或(最好)DateTimeOffset
与TimeZoneInfo
一起存储。
将来,Noda Time应该能够更轻松地为您做到这一点 - 但它尚未准备好进行生产。