Domanda

Ho un DateTime che voglio formattare in " 2009-09-01T00: 00: 00.000Z " ;, ma il seguente codice mi dà " 2009-09- 01T00: 00: 00.000 + 01: 00 " (entrambe le righe):

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

Qualche idea su come farlo funzionare?

È stato utile?

Soluzione

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

Altri suggerimenti

Perché non usare The Round-trip (" ; O " ;, " o ") Identificatore di formato ?

  

La " O " o " o " l'identificatore di formato standard rappresenta una stringa di formato di data e ora personalizzata utilizzando un modello che conserva le informazioni sul fuso orario ed emette una stringa di risultato conforme a ISO 8601. Per i valori di DateTime, questo identificatore di formato è progettato per preservare i valori di data e ora insieme a DateTime. Proprietà gentile nel testo. La stringa formattata può essere analizzata indietro utilizzando il metodo DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact se il parametro styles è impostato su DateTimeStyles.RoundtripKind.

     

La " O " o " o " l'identificatore di formato standard corrisponde al " aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffK " stringa di formato personalizzata per i valori DateTime e per " yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz " stringa di formato personalizzata per i valori DateTimeOffset. In questa stringa, le coppie di virgolette singole che delimitano singoli caratteri, come i trattini, i due punti e la lettera "T", indicano che il singolo carattere è un letterale che non può essere modificato. Gli apostrofi non compaiono nella stringa di output.

     

La O " o " o " identificatore di formato standard (e la stringa di formato "quoty yyyy" - "MM" - "dd'T'HH": "mm": "ss". "fffffffK " custom") sfrutta i tre modi in cui ISO 8601 rappresenta il fuso orario informazioni per preservare la proprietà Kind dei valori DateTime:

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
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

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

Il formato migliore da utilizzare è " yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffK " ;.

L'ultimo K sulla stringa verrà modificato in 'Z' se la data è UTC o con fuso orario (+ -hh: mm) se è locale. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4. aspx )

Come ha detto LukeH, è bene usare ToUniversalTime se si desidera che tutte le date siano UTC.

Il codice finale è:

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

Alcune persone hanno sottolineato che & # 8216; ToUniversalTime & # 8217; è alquanto pericoloso in quanto può causare disparit temporali errati non intenzionali. Espandendo su quello che sto fornendo un esempio più dettagliato di una soluzione. L'esempio qui crea un'estensione per l'oggetto DateTime che restituisce in modo sicuro un DateTime UTC in cui puoi usare ToString come desiderato & # 8230 ;.

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

Desideri utilizzare la classe DateTimeOffset .

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

scusa se ho perso la formattazione originale con i millisecondi

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

Questo codice funziona per me:

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

Prova questo:

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

Domanda posta in precedenza

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top