2010-04-05 14 views

risposta

11

Hai provato qualcosa di simile:

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

dateString = "Thu, 21 Jan 2010 17:47:00 EST"; 
format = "ddd, dd MMM yyyy hh:mm:ss EST"; 

result = DateTime.ParseExact(dateString, format, provider); 
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 

non ho ancora testato (volontà in pochi istanti) ... ma credo che lo farà per te.

Modifica: Sembra che il problema sia che RFC1123 afferma che il fuso orario dovrebbe essere sempre GMT ... motivo per cui r o R ​​non ha funzionato come formato per te. Il problema è l'EST. Il modello sopra rappresenta EST, ma è statico quindi se hai un altro fuso orario potresti essere nei guai. La soluzione migliore sarebbe quella di andare con lo standard RFC1123 e andare al GMT e dovrebbe risolvere il tuo problema. Se non puoi, fammi sapere che potrei avere una soluzione.

Modifica 2: Questa non è una soluzione completa, ma ciò che fa isola il fuso orario e consente comunque di analizzarlo. Il codice non conosce il fuso orario che viene presentato, ma puoi lanciare un'abbreviazione del fuso orario e analizzerà il tempo. Se vuoi convertire in GMT e quindi usare r o R ​​puoi prendere il risultato della corrispondenza regolare, metterlo contro una tabella di ricerca (per vedere quale ora lo compensa per quella sigla del fuso orario), quindi convertire l'ora in GMT e analizzare da lì. Questa sarebbe una buona soluzione, ma un po 'più di lavoro. Ecco il codice:

string dateString, format, pattern, tz; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 
pattern = @"[a-zA-Z]+, [0-9]+ [a-zA-Z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ (?<timezone>[a-zA-Z]+)"; 
dateString = "Thu, 21 Jan 2010 17:47:00 EST"; 

Regex findTz = new Regex(pattern, RegexOptions.Compiled); 

tz = findTz.Match(dateString).Result("${timezone}"); 

format = "ddd, dd MMM yyyy HH:mm:ss " + tz; 

try 
{ 
    result = DateTime.ParseExact(dateString, format, provider); 
    Console.WriteLine("Timezone format is: {0}", format); 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
catch (FormatException) 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 

    Console.ReadLine(); 

Ecco una lista di offset UTC per voi, se si desidera trasformare questo in un convertitore di fuso orario:

Timezone Abbreviations with UTC offsets

+0

Ha senso. Ma il problema è che non ho il controllo sul formato della data come proviene da una fonte esterna. Qualche modo per convertire il fuso orario non GMT in base al GMT e quindi applicare "r" o "R" ?? – Moon

+0

Vorrei avere una risposta migliore di quello che sto per dirti ma ... le abbreviazioni non sono riconosciute., Ho una soluzione ma non è divertente o elegante. Lo posterò e incrocerò le dita che qualcun altro può aiutarti meglio di me! Mi dispiace molto. –

+0

Non è perfetto ma molto meglio! :) Apprezzo il tuo aiuto, lo faccio davvero :) – Moon