web-dev-qa-db-fra.com

Comment puis-je formater DateTime au format Web UTC?

J'ai un DateTime que je veux formater à "2009-09-01T00:00:00.000Z ", mais le code suivant me donne" 2009-09-01T00:00:00.000+01:00 "(les deux lignes):

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

Des idées comment le faire fonctionner?

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

Pourquoi ne pas simplement utiliser Le spécificateur de format Round-trip ("O", "o") ?

Le spécificateur de format standard "O" ou "o" représente une chaîne de format de date et d'heure personnalisée à l'aide d'un modèle qui conserve les informations de fuseau horaire et émet une chaîne de résultat conforme à ISO 8601. Pour les valeurs DateTime, ce spécificateur de format est conçu pour préserver la date. et les valeurs de temps avec la propriété DateTime.Kind dans le texte. La méthode formatée peut être analysée à l'aide de la méthode DateTime.Parse (String, IFormatProvider, DateTimeStyles) ou DateTime.ParseExact si le paramètre styles est défini sur DateTimeStyles.RoundtripKind.

Le spécificateur de format standard "O" ou "o" correspond à la chaîne de format personnalisé "yyyy" - "MM" - "dd'T'HH": "mm": "ss". "FffffffK" pour les valeurs DateTime et au "aaaa" - "MM" - "dd'T'HH": "mm": "ss". "fffffffzzz" chaîne de format personnalisé pour les valeurs DateTimeOffset. Dans cette chaîne, les paires de guillemets simples qui délimitent des caractères individuels, tels que les traits d'union, les deux points et la lettre "T", indiquent que le caractère individuel est un littéral qui ne peut pas être modifié. Les apostrophes n'apparaissent pas dans la chaîne de sortie.

Le spécificateur de format standard O "ou" o "(et la chaîne de format personnalisé" yyyy "-" MM "-" jj'T'HH ":" mm ":" ss "." FffffffK ") tire parti des trois manières ISO 8601 représente les informations de fuseau horaire afin de préserver la propriété Kind des valeurs 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
65
Dmitry Pavlov
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

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

8
arviman

Le meilleur format à utiliser est "aaaa" - "MM" - "jj'T'HH": "mm": "ss". "FffK".

Le dernier K de la chaîne sera remplacé par "Z" si la date est UTC ou par le fuseau horaire (+ -hh: mm) si est local. ( http://msdn.Microsoft.com/en-us/library/8kb3ddd4.aspx )

Comme LukeH l'a dit, il est bon d'utiliser ToUniversalTime si vous voulez que toutes les dates soient au format UTC.

Le code final est:

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

Certaines personnes ont fait remarquer que "ToUniversalTime" est quelque peu dangereux, dans la mesure où il peut provoquer une disparition imprévue de la durée. Je développe un exemple plus détaillé de solution. L'exemple ici crée une extension à l'objet DateTime qui renvoie en toute sécurité un DateTime UTC où vous pouvez utiliser ToString à votre guise….

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

Vous voulez utiliser la classe DateTimeOffset .

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

désolé j'ai manqué votre formatage original avec les millisecondes

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

Ce code fonctionne pour moi:

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);
3
Ergin Çelik