2017-03-15 2 views
-3

À mon avis je retourne une chaîne qui est convertie en DateTime dans mon contrôleur. Le format de chaîne est "ddd MMM dd HH: mm: ss 'EST" aaaa ".Conversion de la chaîne DateHeure en jj mmd jj HH: mm: ss EST 'aaaa format?

Je suis en train de convertir avec succès comme si:

var startDate = DateTime.ParseExact(_startDate, "ddd MMM dd HH:mm:ss 'EST' yyyy", CultureInfo.InvariantCulture); 
model.StartDate = Convert.ToDateTime(startDate); 

Le problème est que les fuseaux horaires pourraient être quelque chose. Comment puis-je rendre compte de cela? Ce n'est pas toujours le cas 'EST'. Si c'est EDT par exemple, il va lancer une exception.

Une chaîne d'entrée exemple serait: Mon Feb 20 00:00:00 EST 2017

Edit: Il peut également être le format ddd MMM d HH:mm:ss 'EST' yyyy Ce ne sera utilisé que dans les zones États-Unis et au Canada Heure.

+1

Pouvez-vous fournir des exemples d'entrées – TheLethalCoder

+1

Possible duplication de [Parse DateTime avec fuseau horaire de forme PST/CEST/UTC/etc] (http://stackoverflow.com/questions/241789/parse-datetime-with-time- zone-de-forme-pst-cest-utc-etc) –

+1

Pourquoi l'appel à 'Convert.ToDateTime' lorsque la variable est * déjà * un' DateTime'? –

Répondre

0

Dans mon contrôleur, je fais ce qui suit maintenant.

var startDateTZ = _startDate.Substring(20, 4); 
     if (startDateTZ[3] == ' ') 
     { 
      startDateTZ = _startDate.Substring(20, 3); 
     } 
     if (startDateTZ.Length > 3) 
     { 
      if (startDateTZ[3] == '0') 
      { 
       startDateTZ = _startDate.Substring(19, 4); 
      } 
      if (startDateTZ[3] == '2') 
      { 
       startDateTZ = _startDate.Substring(19, 3); 
      } 
     } 
     var startDate = new DateTime(); 
     if (_startDate[9] != ' ') 
     { 
      startDate = DateTime.ParseExact(_startDate, "ddd MMM dd HH:mm:ss '" + startDateTZ + "' yyyy", CultureInfo.InvariantCulture); 
     } 
     else 
     { 
      startDate = DateTime.ParseExact(_startDate, "ddd MMM d HH:mm:ss '" + startDateTZ + "' yyyy", CultureInfo.InvariantCulture); 
     } 
     model.StartDate = startDate; 
-3

Essayez cette

String date=System.DateTime.Now.ToString("ddd MMM dd HH:mm:ss 'EST' yyyy"); 
+2

L'OP ne * demande * pas comment formater une date, il demande comment * analyser * une chaîne dans une date –

0

Je vais citer here:

La réponse rapide est, vous ne pouvez pas le faire.

(il y a une explication sur la raison pour laquelle vous ne pouvez pas ... Je ne le copier ici)

Alors ce que je peux vous donner est une méthode pour extraire le fuseau horaire en tant que string , et puis vous ferez tout ce que vous voulez (par exemple vous pourriez avoir un Dictionary<string, offset> ... Pas une très bonne idée mais il pourrait y avoir pire, mais voir this comment: La Russie a changé les règles DST plusieurs fois au cours des 4 dernières années)

public static bool TryParseDateTimeWithTimeZone(string s, out DateTime result, out string timeZone) 
{ 
    if (s == null) 
    { 
     throw new NullReferenceException("s"); 
    } 

    int ixEnd = s.LastIndexOf(' '); 

    if (ixEnd == -1 || ixEnd == 0) 
    { 
     throw new FormatException(); 
    } 

    int ixStart = s.LastIndexOf(' ', ixEnd - 1); 

    if (ixStart == -1) 
    { 
     throw new FormatException(); 
    } 

    timeZone = s.Substring(ixStart + 1, ixEnd - ixStart - 1); 

    string s2 = s.Remove(ixStart) + s.Substring(ixEnd); 

    bool success = DateTime.TryParseExact(s2, "ddd MMM dd HH:mm:ss yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 

    if (!success) 
    { 
     timeZone = null; 
    } 

    return success; 
} 

U se

DateTime dt; 
string tz; 

bool success = TryParseDateTimeWithTimeZone("Mon Feb 20 01:02:00 EST 2017", out dt, out tz); 

maintenant tx == "EST" et dt est 2017-02-20 01:02:00 avec Kind == Undefined.

Autre réponse corrigée pour les abréviations: Timezone Abbreviations.