Использование класса DateTimeOffset
для обработки смещения.
[TestMethod]
public void test()
{
string s = "Mon Nov 16 19:15:09 +0000 2009";
var result = DateTimeOffset.ParseExact(
s,
"ddd MMM dd HH:mm:ss zzz yyyy",
System.Globalization.CultureInfo.InvariantCulture);
Assert.AreEqual(16, result.Day);
Assert.AreEqual(11, result.Month);
Assert.AreEqual(2009, result.Year);
Assert.AreEqual(19, result.Hour);
Assert.AreEqual(15, result.Minute);
Assert.AreEqual(9, result.Second);
Assert.AreEqual(0, result.Offset.Hours);
}
Изменить смещение в строке - например, «0600», а затем измените утверждение смещения для соответствия, оно будет работать.
Затем вы можете преобразовать это в DateTime
, если нужно - но вы потеряете информацию о смещении; поэтому вам нужно решить, будете ли вы сохранять его как исходное местное время (19:15:09
), или вы собираетесь конвертировать в какое-то стандартное время (например, 13:19:05 UTC
, если смещение +06:00
).
Интересно, если вам нужно преобразовать это в ваше собственное местное время - потому что это будет зависеть от того, какие правила DST действовали в 2009 году в это время года - это может вызвать настоящую головную боль!
Итак, если вы собираетесь DateTime
, я рекомендую перейти на универсальное время, а затем перейти оттуда. Добавьте это к тесту:
Console.WriteLine(result);
//little bit long winded - but you need the 'Universal' Kind for reliability
Console.WriteLine(
DateTime.SpecifyKind(
new DateTime(result.ToUniversalTime().Ticks),
DateTimeKind.Utc)
);
Это выводит:
11/16/2009 19:15:09 +06: 00
11/16/2009 13: 15: 09