如何解析字符串" 2015.02.21格林尼治标准时间凌晨1点"到当地日期时间?

时间:2015-02-25 09:26:22

标签: c# parsing datetime

如何解析2015.02.21 1:00 AM GMT到本地日期时间?

我已经从开始和结束时删除了引号2015.02.21 1:00 AM GMT,但是当我使用DateTime.Parse时,它会省略解析时间吗?

DateTime.Parse("2015.02.21 1:00 AM GMT")
{2/21/2015 12:00:00 PM}
    Date: {2/21/2015 12:00:00 AM}
    Day: 21
    DayOfWeek: Saturday
    DayOfYear: 52
    Hour: 12
    Kind: Local
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 635601168000000000
    TimeOfDay: {12:00:00}
    Year: 2015

3 个答案:

答案 0 :(得分:2)

您的字符串是GMT,而您的计算机可能是GMT + 1,所以您看到的是DateTime in" local"时间。要检查它,请尝试将分钟更改为01。您将看到时间被正确解析。或者您可以尝试使用ToUniversalTime()的{​​{1}}方法,并查看此方法返回的时间与字符串中的时间相同。

答案 1 :(得分:0)

也许您应该提供格式以避免任何错误解析的风险。

关于解析:

  • 解析GMT并将字符串视为通用时间。
  • 退货种类为localunspecified。请参阅MSDN中的评论。

因此,当知道时区时,结果总是在当地时间,并且相应的时移会被添加。

var s1 = "2015.02.21 1:00 AM GMT";
var s2 = "2015.02.21 1:00 AM";
var dt1 = DateTime.Parse(s1);
var dt2 = DateTime.Parse(s2);

Console.WriteLine("dt1 is : " + dt1.Kind);  // local with time shift.
Console.WriteLine("dt2 is : " + dt2.Kind);  // unspecified without time shift.

您必须转换为通用时间才能找回您提供的时间。

string s = "2015.02.21 1:00 AM GMT";

// dt is the local time corresponding to the UTC time provided by "s"
var dt = DateTime.ParseExact(s, "yyyy.MM.dd h:mm tt 'GMT'", CultureInfo.InvariantCulture);
Console.WriteLine(dt);    // 21/02/2015 02:00:00 (I live in France GMT+1)

// Go back to universal time.
var udt = dt.ToUniversalTime();
Console.WriteLine(udt);    // 21/02/2015 01:00:00

此外,您可能需要解析指定的GMT,例如2015.02.21 1:00 AM GMT+1

解决方案是:

string s = "2015.02.21 1:00 AM GMT+1";
var dt = DateTime.ParseExact(s, "yyyy.MM.dd h:mm tt 'GMT'z", CultureInfo.InvariantCulture);
Console.WriteLine(dt);   // 21/02/2015 01:00:00 (I live in France GMT+1)

答案 2 :(得分:0)

您需要为DateTime指定种类。默认情况下,当您将字符串转换为DateTime时,系统会将其视为Local。请尝试以下方法:

DateTime dtLocal = DateTime.SpecifyKind(DateTime.Parse("2015.02.21 1:00 AM"), DateTimeKind.Utc).ToLocalTime();