2009-11-30 9 views
48

Ich habe eine DateTime, die ich auf "2009-09-01T00: 00: 00.000Z" formatieren möchte, aber der folgende Code gibt mir "2009-09-01T00: 00: 00.000 + 01: 00" (beide Zeilen) :Wie kann ich DateTime ins Web-UTC-Format formatieren?

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 

Irgendwelche Ideen, wie es funktioniert?

Antwort

99
string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
+0

@Downvoter: Möchten Sie uns sagen, was Sie mit dieser Antwort falsch finden? – LukeH

+10

Dies funktionierte, aber die .ToUniversalTime() wird Ihr vorhandenes Datum durcheinander bringen, wenn es bereits in UTC ist, aber die Variable yourDateTime gibt es nicht an. Am Ende entfernte ich die .ToUniversalTime() und die Daten reihten sich dann mit dem ein, was an beiden Enden erwartet wurde (Datenbank und Webclient). –

-2

Versuchen Sie folgendes:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture); 

Previously asked question

+3

ich es nicht versuchen, (noch) nicht zu analysieren, ich Ich versuche es auszudrucken. – Grzenio

3

Sie wollen DateTimeOffset Klasse verwenden.

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); 
var stringDate = date.ToString("u"); 

leider verpasst ich Ihre ursprüngliche Formatierung mit dem miliseconds

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
6

Das beste Format zu verwenden ist „yyyy '-' MM '-' dd'T'HH ':' mm ':' ss. "fffK".

Die letzte K on-Zeichenkette wird auf "Z" geändert, wenn das Datum UTC ist oder wenn die Zeitzone (+ -hh: mm) lokal ist. (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)

Wie LukeH sagte, ist es gut, die ToUniversalTime zu verwenden, wenn Sie möchten, dass alle Daten UTC sind.

Der letzte Code ist:

string foo = yourDateTime.ToUniversalTime() 
         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK"); 
42

Warum einfach nicht The Round-trip ("O", "o") Format Specifier benutzen?

Das „O“ oder „o“ Standardformatbezeich stellt eine benutzerdefinierte Datums- und Uhrzeitformat-Zeichenfolge ein Muster verwenden, die Zeitzoneninformationen bewahrt und gibt ein Ergebnis Zeichenfolge, die für Datetime-Werte mit ISO 8601 erfüllt, dieses Format Der Spezifizierer wurde entwickelt, um Datums- und Uhrzeitwerte zusammen mit der DateTime.Kind -Eigenschaft im Text beizubehalten. Die formatierte Zeichenfolge kann mithilfe der Methode DateTime.Parse (String, IFormatProvider, DateTimeStyles) oder DateTime.ParseExact analysiert werden, wenn der Parameter styles auf DateTimeStyles.RoundtripKind festgelegt ist.

Der Standardformatbezeichner "O" oder "o" entspricht der benutzerdefinierten Zeichenfolge "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" für DateTime Werte und die "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" benutzerdefinierte Format Zeichenfolge für DateTimeOffset Werte. In dieser Zeichenfolge geben die Paare von einfachen Anführungszeichen, die einzelne Zeichen wie die Bindestriche, die Doppelpunkte und den Buchstaben "T" voneinander abgrenzen, an, dass das einzelne Zeichen ein Literal ist, das nicht geändert werden kann. Die Apostrophe erscheinen nicht in der Ausgabezeichenfolge.

Der Standardformatbezeichner O "oder" o "(und der benutzerdefinierte Formatstring" yyyy - 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK ") hat einen Vorteil der drei Möglichkeiten, die ISO 8601 Zeitzoneninformationen auf die Kind-Eigenschaft der Datetime-Werte zu bewahren darstellt:

public class Example 
{ 
    public static void Main() 
    { 
     DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Unspecified); 
     Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

     DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Utc); 
     Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); 

     DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
            DateTimeKind.Local); 
     Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); 

     DateTimeOffset dto = new DateTimeOffset(lDat); 
     Console.WriteLine("{0} --> {0:O}", dto); 
    } 
} 
// The example displays the following output: 
// 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
// 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
// 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//  
// 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00 
+0

Im Meta-Tag wie 'http-equiv =" last-modified "' ist das Format *** 2013-10-23 @ 17: 23: 00 UTC ***, ist das möglich? –

3

Einige Leute haben darauf hingewiesen, dass ‚ToUniversalTime‘ ist etwas unsicher, dass es unbeabsichtigt falsche Zeit dispalys verursachen können Darauf aufbauend stelle ich ein detaillierteres Beispiel einer Lösung dar. Das Beispiel erstellt hier eine Erweiterung für das DateTime-Objekt, die ein UTC DateTime sicher zurückgibt, wo Sie ToString wie gewünscht verwenden können.

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); 
     DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); 

     //Sample of an unintended mangle: 
     //Prints "2016-06-01 10:17:00Z" 
     Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUtc.SafeUniversal().ToString("u")); 

     //Prints "2016 - 06 - 01 03:17:00Z" 
     Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); 
    } 
} 

public static class ConvertExtensions 
{ 
    public static DateTime SafeUniversal(this DateTime inTime) 
    { 
     return (DateTimeKind.Unspecified == inTime.Kind) 
      ? new DateTime(inTime.Ticks, DateTimeKind.Utc) 
      : inTime.ToUniversalTime(); 
    } 
} 
1
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

kehrt 2017-02-10T08: 12: 39.483Z

0

Dieser Code ist für mich arbeiten:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); 
var text = datetime.ToString("o"); 
Console.WriteLine(text); 
-- 2017-10-27T14:45:53.1750000+03:00 

// datetime from string 
var newDate = DateTime.ParseExact(text, "o", null); 
Verwandte Themen