2008-10-28 27 views
35

Estoy tratando de analizar una cadena de fecha y hora internacional similar a:Analizar DateTime con la zona horaria de forma PST/CET/GMT/etc

24-okt-08 21:09:06 CEST 

Hasta ahora tengo algo como:

CultureInfo culture = CultureInfo.CreateSpecificCulture("nl-BE"); 
DateTime dt = DateTime.ParseExact("24-okt-08 21:09:06 CEST", 
    "dd-MMM-yy HH:mm:ss ...", culture); 

El problema es, ¿qué debo usar para el '...' en la cadena de formato? Al mirar la página Custom Date and Time Format String de MSDN, no parece que aparezca una cadena de formato para analizar las zonas horarias en formato PST/CEST/GMT/UTC.

+11

Para el registro, abreviaturas de zona horaria como EST, PST, el CST no están estandarizados y, a veces son ambiguos (por ejemplo CST puede significar tanto EE.UU. Central Standard Time GMT-6 y China Standard Time GMT + 8). – dbkk

+1

@dbkk y "Cuba Standard Time" Caribbean UTC -5 y "Central Standard Time" América Central UTC - 6 horas. http://www.timeanddate.com/library/abbreviations/timezones/ – Jodrell

Respuesta

29

AFAIK no se reconocen las abreviaturas de zona horaria. Sin embargo, si reemplaza la abreviatura con el desplazamiento de la zona horaria, estará bien. P. ej .:

DateTime dt1 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+2"), "dd-MMM-yy HH:mm:ss z", culture); 
DateTime dt2 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02"), "dd-MMM-yy HH:mm:ss zz", culture); 
DateTime dt3 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02:00"), "dd-MMM-yy HH:mm:ss zzz", culture); 
+8

¿Esto manejará el horario de verano? –

+1

No, no lo hará, ya que el desplazamiento se especifica manualmente aquí. – gzak

3

Tengo dos respuestas porque no estoy seguro de lo que está preguntando.

1) Veo que está utilizando CultureInfo, así que si lo que desea es formato la fecha y la hora de ser cultura específica, yo separaría la fecha/hora y la zona horaria, aplicar el método de cultivo en la fecha/hora y agregue la zona horaria. Si "CEST" es diferente para culturas diferentes, tendrá que cambiarlo enumerando todas las opciones (tal vez en una declaración de caso).

2) Si desea fecha/hora para convertirse en otro huso horario, no se puede utilizar CultureInfo,

sugiero la lectura: http://msdn.microsoft.com/en-us/library/ms973825.aspx

También puede utilizar el .NET Framework 3.5 clase TimeZoneInfo (diferente de TimeZone) para hacerte la vida más fácil.

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

0

Esto es lo que tenía que hacer.

Recibo la fecha y hora de javascript y luego la paso a ASP.NET para almacenarla en la base de datos de Oracle. Aquí está mi código de C# para los horarios del este y el centro.

string datetimevalue = hidfileDateTime.Value; 

datetimevalue= datetimevalue.Replace("EDT", "EST"); 
datetimevalue = datetimevalue.Replace("CDT", "CST"); 
if (datetimevalue.Contains("CST")) 
{ 
    filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss CST yyyy", provider).ToUniversalTime().AddHours(1).ToLocalTime(); 
} 
else 
{ 
    filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss EST yyyy", provider); 
} 
16

La respuesta rápida es: no se puede hacer.


Aquí es por qué,

Existe una base de datos definitiva de las zonas horarias del mundo, se puede obtener desde el IANA here.

El problema es que las abreviaturas de 3 o 4 letras tienen una asociación muchos a uno con las zonas horarias de IANA. Por ejemplo "AMT" significa cosas diferentes, dependiendo de su cultura o qué parte del mundo que se encuentra.

AMT "Armenia Time" Asia   UTC + 4 hours 
AMT "Amazon Time" South America UTC - 4 hours 

Si realmente quiere hacer frente a esto, se sugiere emplear Noda Time para representar sus Instance s. Tendrá que escribir un código para convertir las abreviaturas a una zona horaria IANA estándar.

No podemos hacer esto por usted, depende del contexto de su aplicación.


Otro buen ejemplo es "CST".

CST "China Standard Time" Asia   UTC + 8 hours 
CST "Central Standard Time" Central America UTC - 6 hours 
CST "Cuba Standard Time" Caribbean  UTC - 5 hours 
CST "Central Standard Time" North America UTC - 6 hours 
+0

Técnicamente esto todavía es factible, ya que puede pasar un objeto 'CultureInfo' al analizador para desambiguar su contexto. – gzak

+0

@gzak, sí, si deseaba las abreviaturas localizadas en una cultura aprobada, podría calcular las asignaciones. – Jodrell

+1

No, no podrías. La información cultural le informará sobre el idioma y las preferencias culturales del usuario. No le dirá nada sobre la zona horaria de un usuario. Mi cultura podría ser 'en-US' incluso si estoy visitando Japón. –

6

diccionario de abreviaturas si usted decide ir a la búsqueda & reemplazar ruta (lo hice).

Dictionary<string, string> _timeZones = new Dictionary<string, string>() { 
      {"ACDT", "+1030"}, 
      {"ACST", "+0930"}, 
      {"ADT", "-0300"}, 
      {"AEDT", "+1100"}, 
      {"AEST", "+1000"}, 
      {"AHDT", "-0900"}, 
      {"AHST", "-1000"}, 
      {"AST", "-0400"}, 
      {"AT", "-0200"}, 
      {"AWDT", "+0900"}, 
      {"AWST", "+0800"}, 
      {"BAT", "+0300"}, 
      {"BDST", "+0200"}, 
      {"BET", "-1100"}, 
      {"BST", "-0300"}, 
      {"BT", "+0300"}, 
      {"BZT2", "-0300"}, 
      {"CADT", "+1030"}, 
      {"CAST", "+0930"}, 
      {"CAT", "-1000"}, 
      {"CCT", "+0800"}, 
      {"CDT", "-0500"}, 
      {"CED", "+0200"}, 
      {"CET", "+0100"}, 
      {"CEST", "+0200"}, 
      {"CST", "-0600"}, 
      {"EAST", "+1000"}, 
      {"EDT", "-0400"}, 
      {"EED", "+0300"}, 
      {"EET", "+0200"}, 
      {"EEST", "+0300"}, 
      {"EST", "-0500"}, 
      {"FST", "+0200"}, 
      {"FWT", "+0100"}, 
      {"GMT", "GMT"}, 
      {"GST", "+1000"}, 
      {"HDT", "-0900"}, 
      {"HST", "-1000"}, 
      {"IDLE", "+1200"}, 
      {"IDLW", "-1200"}, 
      {"IST", "+0530"}, 
      {"IT", "+0330"}, 
      {"JST", "+0900"}, 
      {"JT", "+0700"}, 
      {"MDT", "-0600"}, 
      {"MED", "+0200"}, 
      {"MET", "+0100"}, 
      {"MEST", "+0200"}, 
      {"MEWT", "+0100"}, 
      {"MST", "-0700"}, 
      {"MT", "+0800"}, 
      {"NDT", "-0230"}, 
      {"NFT", "-0330"}, 
      {"NT", "-1100"}, 
      {"NST", "+0630"}, 
      {"NZ", "+1100"}, 
      {"NZST", "+1200"}, 
      {"NZDT", "+1300"}, 
      {"NZT", "+1200"}, 
      {"PDT", "-0700"}, 
      {"PST", "-0800"}, 
      {"ROK", "+0900"}, 
      {"SAD", "+1000"}, 
      {"SAST", "+0900"}, 
      {"SAT", "+0900"}, 
      {"SDT", "+1000"}, 
      {"SST", "+0200"}, 
      {"SWT", "+0100"}, 
      {"USZ3", "+0400"}, 
      {"USZ4", "+0500"}, 
      {"USZ5", "+0600"}, 
      {"USZ6", "+0700"}, 
      {"UT", "-0000"}, 
      {"UTC", "-0000"}, 
      {"UZ10", "+1100"}, 
      {"WAT", "-0100"}, 
      {"WET", "-0000"}, 
      {"WST", "+0800"}, 
      {"YDT", "-0800"}, 
      {"YST", "-0900"}, 
      {"ZP4", "+0400"}, 
      {"ZP5", "+0500"}, 
      {"ZP6", "+0600"} 
     }; 
+5

Lo sentimos, pero este enfoque no es confiable. Cualquier lista de abreviatura codificada para compensar es obstinada con respecto a las ambigüedades, y es solo una instantánea en el tiempo. –

+1

Por supuesto que sí. Es igual (no) confiable que el uso de estas zonas horarias no estandarizadas en primer lugar. Mi respuesta es solo respaldar la respuesta aceptada. Recuerde votar abajo también. –

+1

Algunas personas (iría aún más lejos y dicen más) en realidad solo reciben datos pertinentes a una sola cultura. Este enfoque, aunque es perfecto, será suficiente. –

Cuestiones relacionadas