如何将字符串“2015.02.21 1:00 AM GMT”解析为本地日期时间?
how can I parse string "2015.02.21 1:00 AM GMT" to local date time?
如何将 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
您的字符串是 GMT,而您的计算机可能是 GMT+1,所以您看到的是 DateTime
时间 "local"。要检查它,例如尝试将分钟更改为 01
。您会看到时间已正确解析。或者您可以尝试使用 DateTime
的 ToUniversalTime()
方法并查看此方法返回的时间与字符串中的时间相同。
也许您应该提供格式以避免任何错误解析的风险。
关于解析:
- GMT 被解析,字符串被认为是通用时间。
- return 种类是
local
或 unspecified
。见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)
您需要为日期时间指定类型。默认情况下,当您将字符串转换为 DateTime 时,系统会将其视为 Local。请尝试以下操作:
DateTime dtLocal = DateTime.SpecifyKind(DateTime.Parse("2015.02.21 1:00 AM"), DateTimeKind.Utc).ToLocalTime();
如何将 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
您的字符串是 GMT,而您的计算机可能是 GMT+1,所以您看到的是 DateTime
时间 "local"。要检查它,例如尝试将分钟更改为 01
。您会看到时间已正确解析。或者您可以尝试使用 DateTime
的 ToUniversalTime()
方法并查看此方法返回的时间与字符串中的时间相同。
也许您应该提供格式以避免任何错误解析的风险。
关于解析:
- GMT 被解析,字符串被认为是通用时间。
- return 种类是
local
或unspecified
。见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)
您需要为日期时间指定类型。默认情况下,当您将字符串转换为 DateTime 时,系统会将其视为 Local。请尝试以下操作:
DateTime dtLocal = DateTime.SpecifyKind(DateTime.Parse("2015.02.21 1:00 AM"), DateTimeKind.Utc).ToLocalTime();