2016-03-30 16 views
13

Es gibt diese SOAP Webservice zu erzeugen, die mir Datetime-Objekte in folgendem FormatWie zu analysieren und Datetime-Objekte in ISO 8601

2016-03-29T12:20:35.093-05:00 

an diesem Tag 29 März 2016. Hour des Jahres ist sendet: 12: 20: 35,093 (GMT-5).

Ich mag ein DateTime-Objekt erstellen zu können, wie folgt aus:

DateTime.Now 

und erhalten die Stringdarstellung im Format oben und auch die inverse Operation beschrieben, einen Datetime aus einem String wie das erstellen oben gegeben.

Ich habe versucht, die folgenden, um das Datum zu erstellen:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc) 

Allerdings kann ich nicht nicht sehen, wie GMT-5 dort specifie ...

ich nicht wissen, wie man eine DateTime in das angegebene Zeichenfolgenformat konvertiert.

Mit Nates Code Ich mache folgendes:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3)); 

FormatIso8601(d) 

aber dieser Aufruf zurückkehrt: "2016-03-29T15: 20: 35Z" statt:

"2016-03-29T12:20:35.093-03:00" 

was ich wirklich brauche.

Ich denke, das funktioniert:

 d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz") 
+1

Haben Sie auch versuchen, den Einsatz 'DateTime.Parse' zu ​​versuchen? – leppie

+0

Ja, aber ich konnte den Weg überhaupt nicht finden. Sonst wäre ich nicht hergekommen um zu fragen –

+3

Du musst erklären was du kannst und was nicht, genau. – leppie

Antwort

21

Das Format Sie beschreiben ISO 8601 ist.

Da Sie mit Zeitstempeln arbeiten, die eine Zeitzonenkomponente enthalten, empfehle ich dringend, anstelle von DateTime zu verwenden. Es macht die Dinge so viel einfacher!

Um einen DateTimeOffset für ein bestimmtes Datum, Zeit und Zeitzonen-Offset, benutzen Sie diese Syntax zu erstellen:

var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5)); 
// March 29, 2016 at 12:20:35.93 GMT-5 

eine DateTimeOffset wie ISO 8601 Dieser Code formatieren:

public static string FormatIso8601(DateTimeOffset dto) 
{ 
    string format = dto.Offset == TimeSpan.Zero 
     ? "yyyy-MM-ddTHH:mm:ss.fffZ" 
     : "yyyy-MM-ddTHH:mm:ss.fffzzz"; 

    return dto.ToString(format, CultureInfo.InvariantCulture); 
} 

Und, zu analysieren, einen String zurück zu einem DateTimeOffset:

public static DateTimeOffset ParseIso8601(string iso8601String) 
{ 
    return DateTimeOffset.ParseExact(
     iso8601String, 
     new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" }, 
     CultureInfo.InvariantCulture, 
     DateTimeStyles.None); 
} 

Wenn Sie zu einem DateTime zurückkommen müssen, können Sie dieses von der erhalten. UtcDateTime Eigentum.

+0

Vielen Dank. Ist das sicher? ParseIso8601 (myDate) .DateTime, um ein Datetime-Objekt zu erhalten? In meinem System würde ich, wenn möglich, anstelle von datetimeoffsets datetimes benötigen. Danke –

+0

Es ist möglich, aber hüten Sie sich vor unbeabsichtigten Nebenwirkungen: Die Zeit hängt von der lokalen Zeitzone Ihres Rechners ab. UtcDateTime gibt immer eine UTC-Zeit zurück, wenn Sie diese Konvertierung vermeiden möchten. –

+1

So ist es unmöglich, ein DateTime-Objekt zu erhalten, das dieselbe genaue Zeit darstellt, die ich in der Zeichenfolge an ParseIso8601 übergeben habe? –

12

Eine einfachere Möglichkeit besteht darin, die ToString-Methode für DateTimeOffset mit dem Argument "o" zu verwenden. Dies druckt automatisch das Datum im ISO8601-Format

DateTimeOffset.Now.ToString("o"); 

Die statische Parse-Methode auch richtig Parsen ein Datum in ISO8601-Format fähig ist.

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00"); 
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z"); 
0

Einfache Antwort: DateTime.UtcNow.ToString("o")