format de date aaaa-MM-jjTHH: mm: ssZ


102

Je suppose que cela devrait être assez simple, mais je n'ai pas pu l'obtenir: (. Dans ce format, Z est le fuseau horaire.
T est un modèle de temps long
Comment pourrais-je obtenir une date dans ce format sauf en utilisant

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

en C #


Je sais que cette question existe depuis 9 ans, mais la réponse acceptée UtcNow.ToString(s)+Zest la mauvaise. ISO8601 est pris en charge par l' option RoundTripToString("O") . Il faut également souligner que la réponse acceptée utilise la valeur UTC du datetime, qui donnerait toujours le fuseau horaire Z, plutôt que d'utiliser simplement la valeur datetime réelle, qui (si Kind = Local) peut contenir un fuseau horaire d'heure d'été. Pensez à changer la réponse acceptée?
Richardissimo

Réponses:


144

Utiliser UTC

ISO 8601 ( formats datetime MSDN )

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

2009-11-13T10: 39: 35Z

Le Z est là parce que

Si l'heure est en UTC, ajoutez un «Z» directement après l'heure sans espace. «Z» est le désignateur de zone pour le décalage UTC zéro. "09:30 UTC" est donc représenté par "09: 30Z" ou "0930Z". "14:45:15 UTC" serait "14: 45: 15Z" ou "144515Z".

Si vous souhaitez inclure un décalage

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

Deux choses à noter: + ou - est nécessaire après le temps, mais évidemment + ne s'affiche pas sur les nombres positifs. Selon wikipedia, le décalage peut être au format + hh ou + hh: mm. Je suis resté à quelques heures seulement.

Autant que je sache, RFC1123 (date HTTP, le formateur "u") n'est pas destiné à donner des décalages de fuseau horaire. Toutes les heures sont censées être GMT / UTC.


Cool. Votre sortie n'inclut pas le décalage TZ, cependant?
Neil Barnwell

Je l'ai ajouté - la documentation dit que le format «s» est basé sur ISO8601, je ne pense pas qu'il inclut le fuseau horaire.
Chris S

Oh bien sûr, UTC n'a pas de fuseaux horaires. D'oh. Il demande des informations sur le fuseau horaire dans sa sortie. Peut-être que DateTimeOffset est ce qu'il recherche?
Neil Barnwell

5
Ajouter Z manuellement n'est pas bon, vous devriez utiliser .ToString ("o") car cela vous donnera la bonne sortie. Si les millisecondes posent problème, elles doivent être arrondies. L'ajout manuel de Z peut donner un résultat incorrect si vous l'ajoutez à l'heure locale, qui n'est pas vraiment UTC.
Tuukka Lindroos

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Les sorties:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

J'ai utilisé Console.WriteLine (DateTime.Now.ToString ("o")) ;. Merci
Ziggler

5
La réponse acceptée dit d'utiliser le spécificateur de format "s" et d'ajouter un Z à la fin pour les dates UTC. C'est très bien si vous n'avez pas besoin des millisecondes, mais si vous voulez les millisecondes, vous devez utiliser "o" comme le montre cette réponse. Avec "o", les millisecondes apparaissent par défaut et le Z est déjà ajouté à la fin pour les dates UTC.
Jim

1
DateTime.Now.ToString ("o") Résout tous les types de problèmes car il renvoie le bon décalage avec lui.
Mo Zaatar

12

Le format "o" est différent pour DateTime et DateTimeOffset :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Ma réponse finale est

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

En C # 6+, vous pouvez utiliser l'interpolation de chaîne et rendre cela plus laconique:

$"{DateTime.UtcNow:s}Z"

vous m'avez sauvé beaucoup de temps. Solution simple et douce.
Raju Paladiya

6

Regardez ici les modèles "u" et "s". Le premier est sans séparateur «T», et le second est sans suffixe de fuseau horaire.


5

Code de ligne unique pour cela.

var temp   =  DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");

5

Une option pourrait être la conversion de DateTime en ToUniversalTime () avant la conversion en chaîne en utilisant le format «o» . Par exemple,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

Il produira:

2016-01-31T20:16:01.9092348Z

2

Cela fonctionne bien avec les formats de date / heure de requête de l'API REST Salesforce

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

Il renvoie les résultats de Salesforce sans aucun problème.


-6

Vous pourriez diviser les choses, cela nécessiterait plus de code, mais fonctionnerait exactement comme vous le souhaitez:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

ect.

enfin:

Console.WriteLine(year+month+day+etc.);

C'est une manière très audacieuse de la gérer cependant ...


Cette réponse ne produit rien comme la sortie désirée
cja

Cela n'a pas fourni ce que la question ou je voulais ... -1
Ziggler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.