Разбор пользовательских форматов даты (c #) - PullRequest
0 голосов
/ 22 июня 2011

API, который я использую, предоставляет мне дату. Эта дата имеет тип string и представлена ​​в формате:

Mon Nov 16 19:15:09 +0000 2009

DateTime.TryParse() завершается неудачно, если задано это значение. Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

8 голосов
/ 22 июня 2011

Использование класса 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

2 голосов
/ 22 июня 2011

Попробуйте DateTime.TryParseExact , передав строку подходящего формата.

0 голосов
/ 22 июня 2011

Поскольку метод DateTime.TryParse (String, DateTime) пытается проанализировать строковое представление даты и времени, используя правила форматирования текущей культуры, попытка синтаксического анализа конкретной строки в разных культурах может либо привести к сбою, либо вернуть разные результаты. , Если определенный формат даты и времени будет проанализирован в разных локалях, используйте метод DateTime.TryParse (String, IFormatProvider, DateTimeStyles, DateTime) или одну из перегрузок метода TryParseExact и укажите спецификатор формата.

0 голосов
/ 22 июня 2011

Один из методов TryParse принимает IFormatProvider, который также может представлять собой класс DateTimeFormatInfo. Следующая ссылка содержит все необходимые данные:

http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx

Ваш будет почти как: ддд, МММ дд гггг ЧЧ ':' мм ':' ss zzz гггг *

Единственная проблема - смещение часового пояса, zzz включает двоеточие между часами и минутами. Вы могли бы избежать использования zz'00 ', хотя это обман.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...