C#DateTime在不同时区中从字符串转换为DateTime

C#DateTime在不同时区中从字符串转换为DateTime,c#,datetime,timezone,C#,Datetime,Timezone,我正在与一个问题作斗争。我有一个字符串日期,看起来像这样,“2015-05-02 01:00:00”,从数据库中提取 我知道现在是英国时间,但我的当地时间是比利时时间。 我试图将日期存储在UTC和(CEST或CET取决于季节)中,并将其从我提取的英国时间转换过来 我试图将Kind属性设置为英国时间,但结果似乎是本地时间或utc时间。因此,我可以完成一半的工作,但不能完成其余的工作(例如,我仍然需要CEST/CET时间) 我试着用这个: string dateString = (string) l

我正在与一个问题作斗争。我有一个字符串日期,看起来像这样,“2015-05-02 01:00:00”,从数据库中提取

我知道现在是英国时间,但我的当地时间是比利时时间。 我试图将日期存储在UTC和(CEST或CET取决于季节)中,并将其从我提取的英国时间转换过来

我试图将Kind属性设置为英国时间,但结果似乎是本地时间或utc时间。因此,我可以完成一半的工作,但不能完成其余的工作(例如,我仍然需要CEST/CET时间)

我试着用这个:

string dateString = (string) line["stringDate"];

DateTime ukTime = DateTime.Parse(dateString, new CultureInfo("en-GB", false));
DateTime belgianTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(ukTime, "Romance Standard Time");
英国时间和比利时时间的结果相同:2015-05-02 01:00:00,种类=未指定


比利时时间应为2015-05-02 02:00:00

使用以下代码行

var time = DateTime.Parse(DateTime.Now.ToString());
        var clientZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
        var utcTime = TimeZoneInfo.ConvertTimeToUtc(time, clientZone);

您必须使用
ConvertTime
方法

快速样本-

string s = "2015-05-02 01:00:00";

var dt = new DateTime(2015, 05, 02, 1, 0, 0);

var t = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"), 
                     TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"));

如果您只是将源时区添加到转换方法中,它会给出所需的答案,即使没有指定
IFormatProvider

string dateString = (string) line["stringDate"];

DateTime ukTime = DateTime.Parse(dateString);
DateTime belgianTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(ukTime,
    "GMT Standard Time",
    "Romance Standard Time");
这就给了时间
Kind==Unspecified
。但是,如果您使用:

var belgianTime = TimeZoneInfo.ConvertTime(ukTime,
    TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"), 
    TimeZoneInfo.Local);

对于转换,您将得到
Kind==Local

等待Jon Skeet出现,建议使用Joda:-)您是否尝试过
ukTime.ToLocalTime()
?我在
belgianTime
2015/5/2 3:00:00
中尝试过这一结果。如果我使用
ToLocalTime
它的结果与
ukTime
@derape的结果相同,那么C#的结果不是很好吗?乔达不是爪哇人吗?@DannyGoodall啊,没错!我搞混了