Как преобразовать строку с необычным форматом в datetime - PullRequest
3 голосов
/ 09 апреля 2010

Я использую .NET 3.5, и у меня есть дата в виде строки в следующем формате:

Вт 20 января 20:47:43 GMT 2009

Первый вопрос, как называется этот формат? Второй вопрос, какой самый простой и понятный способ преобразовать эту строку в дату и время? Я хотел бы иметь возможность использовать метод .net API / Helper, если это возможно.

Изменить: я забыл упомянуть, что я уже пытался использовать DateTime.Parse и Convert.ToDateTime. Никто из них не работал.

Ответы [ 9 ]

11 голосов
/ 09 апреля 2010

Вы можете использовать метод DateTime.TryParseExact () с подходящей строкой формата. Смотри здесь

РЕДАКТИРОВАТЬ: Попробуйте что-то вроде этого:

        DateTime dt;
        System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US"); 

        if ( DateTime.TryParseExact( "Tue Jan 20 20:47:43 GMT 2009", "ddd MMM dd H:mm:ss \"GMT\" yyyy", enUS, System.Globalization.DateTimeStyles.NoCurrentDateDefault , out dt  ))
        {
            Console.WriteLine(dt.ToString() );
        }
2 голосов
/ 10 апреля 2010

Вот и все

DateTime d = DateTime.ParseExact("Tue Jan 20 20:47:43 GMT 2009".Replace("GMT", "+00"), "ddd MMM dd H:mm:ss zz yyyy", new CultureInfo("en-US"));

API DateTime и его документация отстой. Исключения только скажут вам, что «String не был распознан как действительный DateTime», что на самом деле не помогает. Он должен был сам определить спецификаторы формата даты, потому что я не нашел их в MSDN.

Язык "en-US" необходим, я думаю, потому что в вашем формате даты используются английские сокращения, такие как "Tue".

В любом случае, я не могу сказать вам, как называется формат даты. Он очень похож, но не равен формату, используемому в HTTP (например, If-Modified-Since: Wed, 08 Dec 2004 13:25:25 GMT).

2 голосов
/ 09 апреля 2010
DateTime dt;
if(DateTime.TryParse("Tue Jan 20 20:47:43 GMT 2009", out dt)){
   /* Yay.. it's valid */
}

Вы также можете использовать TryParseExact, где вы можете указать формат вашего DateTime

Использование TryparseExact

const string FORMAT = "ddd MMM dd HH:mm:ss \"GMT\" yyyy";
if (DateTime.TryParseExact("Tue Jan 20 20:47:43 GMT 2009", FORMAT, CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal, out dt)) {
        /* is valid */
 }    

Я считаю, что это должно работать. Не уверен, что попытается разобрать время по Гринвичу.

0 голосов
/ 10 апреля 2010

Вы можете использовать DateTime.ParseExact или DateTimeOffset.ParseExact , чтобы указать формат строки даты.

Хотя я не смог быстро выяснить, как соответствовать спецификатору часового пояса (т.е. по Гринвичу). Посмотрите на некоторые результаты Google, показывает, что большинство людей, которые пытаются решить эту проблему, делают это эвристически - составляя список всех часовых поясов и смещений, а затем анализируя строку и заменяя спецификатор часового пояса на +/- смещение или какой-то другой хакерский подход. Хотя ни одно из этих решений не было разработано StackOverflow, так что кто знает, насколько они хороши.

Вот короткий пример, который я написал, с "GMT", вырезанным из строки даты, пытающейся конвертироваться. Если вы можете заменить часовой пояс смещением, добавьте «zzz» в строку формата. Для разбора других форматов, вот страница MSDN Пользовательские строки формата даты и времени , в которой перечислены все из них.

// Parse date and time with custom specifier.
string dateString = "Tue Jan 20 20:47:43 2009";
string format = "ddd MMM dd HH:mm:ss yyyy";
DateTime result;
System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}
0 голосов
/ 10 апреля 2010
CultureInfo enUS = new CultureInfo( "en-US" ); 

DateTime dt = DateTime.ParseExact( "Tue Jan 20 19:47:43 GMT 2009", "ddd MMM dd HH:mm:ss 'GMT' yyyy", enUS, DateTimeStyles.None );

Console.WriteLine( dt.ToString() );
0 голосов
/ 09 апреля 2010

Попробуйте это:

DateTime.TryParse(Tue Jan 20 20:47:43 GMT 2009", out objDt);

Вам необходимо указать выходное значение. Используйте If и если он возвращает true, то это действительная дата.

НТН

0 голосов
/ 09 апреля 2010

Попробуйте выполнить DateTime.Parse («Вторник, 20 января 20:47:43 GMT 2009») и посмотреть, принимает ли он его.

Вот хорошая ссылка для пользовательского форматирования DateTime.

http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Надеюсь, это поможет.

0 голосов
/ 09 апреля 2010

Вы можете использовать Convert.ToDateTime

0 голосов
/ 09 апреля 2010
DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...