2017-03-15 4 views
-3

Aus meiner Sicht gebe ich eine Zeichenfolge zurück, die in meinem Controller in eine DateTime konvertiert wird. Das String-Format ist "ddd MMM TT HH: mm: ss 'EST' yyyy".Konvertieren von DateTime Zeichenfolge in ddd MMM TT HH: mm: SS 'EST' JJJJ-Format?

ich es erfolgreich bin Umwandlung in etwa so:

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

Das Problem ist, dass die Zeitzonen könnte alles sein. Wie kann ich das erklären? Es ist nicht immer der Fall, es wird 'EST' sein. Wenn es zum Beispiel EDT ist, wird eine Ausnahme ausgelöst.

Ein Beispiel Eingabestring wäre: Mon Feb 20 00:00:00 EST 2017

Edit: Es ist auch das Format sein kann ddd MMM d HH:mm:ss 'EST' yyyy Dies wird nur in USA und Kanada Zeitzonen verwendet werden.

+1

Können Sie einige Beispieleingaben bereitstellen – TheLethalCoder

+1

Mögliches Duplikat von [Parse DateTime mit Zeitzone des Formulars PST/CEST/UTC/etc] (http://stackoverflow.com/questions/241789/parse-datetime-with-time-) zone-of-form-pst-cest-utc-etc) –

+1

Warum der Aufruf von 'Convert.ToDateTime' wenn die Variable * bereits * eine' DateTime' ist? –

Antwort

0

In meinem Controller versuche ich nun folgendes tun.

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

Diese

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

Das OP fragt * nicht *, wie man ein Datum formatiert, er fragt, wie man eine Zeichenfolge in ein Datum * eingruppiert –

0

ich aus here zitieren werde:

Die schnelle Antwort ist, können Sie es nicht tun.

(gibt es eine Erklärung über den Grund, warum Sie nicht ... Ich werde es hier nicht kopieren)

Also, was ich geben kann Ihnen eine Methode ist, die Zeitzone als string zu extrahieren und dann wirst du tun, was immer du willst (zum Beispiel könntest du eine Dictionary<string, offset> haben ... keine sehr gute Idee, aber es könnte schlimmer sein, aber siehe this comment: Russland hat die DST Regeln in den letzten 4 Jahren mehrmals geändert)

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); 

Jetzt tx == "EST" und dt ist 2017-02-20 01:02:00 mit Kind == Undefined.

Andere verbundene Antwort für Abkürzungen: Timezone Abbreviations.

Verwandte Themen