我正在尝试将String转换为Datetime对象,而不修改它并向Datetime对象添加额外的小时/偏移量。
这是代码:
string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS
DateTime date = Convert.ToDateTime(dateStr);
Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("date toString: " + date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK"));
输出:
Original string: 2011-03-18T12:07:00.000+10:00
date toString: 2011-03-18T13:07:00.000+11:00
如果有人可以指出我如何忽略DST或者甚至将日期转换回我想要的日期时间对象,那将非常感激。
沿着修改日期时间的路径前进: 我试图将Datetime转换回来,但我无法弄清楚如何更改Datetime对象中的时区,当我使用DatetimeOffset对象来完成这项工作时,当我调用 DatetimeOffset.Datetime 时它返回没有偏移的日期时间
答案 0 :(得分:3)
DateTime
对象不包含时区。它只包含Kind
,可以是Utc
,Local
或Unspecified
。
调用Convert.ToDateTime
时,如果存在任何偏移量,则会应用该偏移量,然后该值将转换为本地时区。那是 - 代码运行的时区。
然后,通过在输出格式中使用K
,它返回该特定日期的本地时区的偏移量。
要正确处理此方案,请使用DateTimeOffset
类型:
string dateStr = "2011-03-18T12:07:00.000+10:00";
DateTimeOffset dto = DateTimeOffset.Parse(dateStr);
Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("dto toString: " + dto.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK"));
关于你的陈述:
当我调用DatetimeOffset.Datetime时,它返回没有偏移的日期时间
这是正确的。只有DateTimeOffset
类型具有要返回的偏移量。 DateTime
对象只能返回机器的本地偏移量,对于带有DateTime
的{{1}},只能返回零。
答案 1 :(得分:0)
.NET框架中的TimezoneInfo类可以提供答案(http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx)
string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS
DateTime localDateTime = DateTime.Parse(date);
DateTime utcDateTime = localDateTime.ToUniversalTime();
string estKey = "Eastern Standard Time";
TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById(estKey);
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estTimeZone);
Console.WriteLine("Original string: " + dateStr);
Console.WriteLine("date toString: " + estDateTime);
答案 2 :(得分:-1)
DateTime dt = DateTime.Now.ToUniversalTime()+ TimeZoneInfo.Local.BaseUtcOffset;