2013-05-13 6 views
2

Хорошо, поэтому я пытаюсь прочитать дату/время XML-канала Twitter, в настоящее время он находится в таком формате: Пт май 03 15:22:09 +0000 2013 Однако мой C# не читает его как тип даты/времени.Преобразование этого в формат времени даты C#

Это то, что я получил:

ArticleDate = DateTime.Parse(d.Element("created_at").Value) 

created_at содержит: пт 3 мая 15:22:09 +0000 2013 Формат

+0

Что делать поисковые запросы на ту же тему на SO сказать? – I4V

+0

Попробуйте [DateTime.ParseExact] (http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx). –

ответ

1

Использование DateTime.TryParseExact как:

if (DateTime.TryParseExact("Fri May 03 15:22:09 +0000 2013", 
               "ddd MMMM dd HH:mm:ss zzz yyyy", 
               CultureInfo.InvariantCulture, 
               DateTimeStyles.None, 
               out ArticleDate)) 
      { 
       //date is fine 
      } 
+0

Часть '+ 0000' может использоваться как' zzz' для смещения часового пояса – V4Vendetta

+0

@ V4Vendetta, thats perfect, но это делает мой ответ дубликат так + 1, вам – Habib

2

Вы должны используйте ParseExact of DateTime, чтобы получить свое значение

DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013","ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture); 
+0

Закрыть, но вы вводите локальный часовой пояс компьютера. См. Мой ответ для деталей. –

6

Будьте осторожны. Время, которое вы получили назад, находится в UTC. В результате вы можете непреднамеренно позволить локальному часовому поясу повлиять на результат.

Например, один из других ответов предложил этот код:

DateTime dt = DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013", 
            "ddd MMM dd HH:mm:ss zzz yyyy", 
            CultureInfo.InvariantCulture); 

В результате этого на моем компьютере, который находится в Аризоне (UTC-7), является:

5/3/2013 8:22:09 AM (dt.Kind == DateTimeKinds.Local) 

Хотя это правильный момент в мое местное время, это не то, что мне было дано, и это, вероятно, не то, что вы ожидаете, если не обратить пристальное внимание на свойство .Kind.

Вы можете вместо этого сделать следующее:

DateTime dt = DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013", 
            "ddd MMM dd HH:mm:ss zzz yyyy", 
            CultureInfo.InvariantCulture, 
            DateTimeStyles.AdjustToUniversal); 

Это возвращает:

5/3/2013 3:22:09 PM (dt.Kind == DateTimeKinds.Utc) 

Что лучше соответствует тому, что вы начали с.

Теперь это предполагает, что значения, возвращаемые из Twitter, всегда будут UTC. Кажется, это так, according to their FAQ. Но можно утверждать, что, поскольку нам присваивается смещение, может быть более правильным использовать это смещение, как предусмотрено. Если смещение когда-либо изменяется, мы не хотим, чтобы наш код прерывался. Поэтому более целесообразно использовать класс DateTimeOffset.

DateTimeOffset dto = DateTimeOffset.ParseExact("Fri May 03 15:22:09 +0000 2013", 
               "ddd MMM dd HH:mm:ss zzz yyyy", 
               CultureInfo.InvariantCulture); 

В результате которого:

5/3/2013 3:22:09 PM +00:00 
1

Фактический код исправления для этого конкретного формата даты с использованием Twitter APi XML ниже:

using System.Globalization; 

CultureInfo enUS = new CultureInfo("en-US");     
DateTime dateValueOut; 
string userCreated = "Fri May 03 15:22:09 +0000 2013"; 

bool isDateFormatted = DateTime.TryParseExact(userCreated,"ddd MMM dd HH:mm:ss zzzz yyyy",enUS,DateTimeStyles.None, out dateValueOut); 

if (isDateFormatted == true) 
{ 
    DateTime formattedDateTime = dateValueOut;      
} 
Смежные вопросы