formato data aaaa-MM-ggTHH: mm: ssZ


102

Presumo che dovrebbe essere piuttosto semplice, ma non sono riuscito a ottenerlo :(. In questo formato Z è il fuso orario.
T è un modello di tempo lungo
Come posso ottenere una data in questo formato se non usando

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

in C #


So che questa domanda UtcNow.ToString(s)+Zesiste da 9 anni ma la risposta accettata è quella sbagliata. ISO8601 è supportato dall'opzione RoundTripToString("O") . Inoltre, per sottolineare che la risposta accettata utilizza il valore UTC del datetime, che darebbe sempre il fuso orario Z, piuttosto che utilizzare solo il valore datetime effettivo, che (se Kind = Local) potrebbe contenere un fuso orario dell'ora legale. Considera l'idea di cambiare la risposta accettata?
Richardissimo

Risposte:


144

Utilizzando UTC

ISO 8601 ( formati datetime MSDN )

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

13-11-2009T10: 39: 35Z

La Z è lì perché

Se l'ora è in UTC, aggiungi una "Z" subito dopo l'ora senza spazi. 'Z' è la designazione della zona per lo scostamento zero UTC. "09:30 UTC" è quindi rappresentato come "09: 30Z" o "0930Z". "14:45:15 UTC" sarebbe "14: 45: 15Z" o "144515Z".

Se vuoi includere un offset

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

Due cose da notare: + o - è necessario dopo il tempo ma ovviamente il + non viene visualizzato sui numeri positivi. Secondo wikipedia l'offset può essere in formato + hh o + hh: mm. Ho tenuto solo poche ore.

Per quanto ne so, RFC1123 (data HTTP, il formattatore "u") non ha lo scopo di fornire offset di fuso orario. Tutti gli orari si intendono GMT / UTC.


Freddo. Il tuo output non include l'offset TZ, però?
Neil Barnwell

L'ho aggiunto in - i documenti dicono che il formato 's' è basato su ISO8601 Non penso che includa il fuso orario.
Chris S

Ovviamente, UTC non ha fusi orari. D'oh. Chiede informazioni sul fuso orario nel suo output. Forse DateTimeOffset è quello che sta cercando?
Neil Barnwell

5
Aggiungere Z manualmente non va bene, dovresti usare .ToString ("o") perché ti darà l'output corretto. Se i millisecondi sono un problema, dovrebbero essere arrotondati. L'aggiunta manuale di Z può dare risultati errati se la aggiungi all'ora locale, che non è realmente UTC.
Tuukka Lindroos

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

Uscite:

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

Ho usato Console.WriteLine (DateTime.Now.ToString ("o")) ;. Grazie
Ziggler

5
La risposta accettata dice di utilizzare l'identificatore di formato "s" e di aggiungere una Z alla fine per le date UTC. Va tutto bene e va bene se non hai bisogno dei millisecondi, ma se vuoi i millisecondi devi usare "o" come mostra questa risposta. Con "o", i millisecondi vengono visualizzati per impostazione predefinita e la Z è già aggiunta alla fine per le date UTC.
Jim,

1
DateTime.Now.ToString ("o") Risolve tutti i tipi di problemi perché restituisce il giusto offset con esso.
Mo Zaatar

12

Il formato "o" è diverso per DateTime e DateTimeOffset :(

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

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

La mia risposta finale è

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

7

In C # 6+ puoi usare l'interpolazione di stringhe e renderla più concisa:

$"{DateTime.UtcNow:s}Z"

mi hai risparmiato molto tempo. Soluzione semplice e dolce.
Raju Paladiya

6

Guarda qui i modelli "u" e "s". Il primo è senza separatore "T" e il secondo è senza suffisso di fuso orario.


5

Codice a riga singola per questo.

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

5

Un'opzione potrebbe essere la conversione di DateTime in ToUniversalTime () prima della conversione in stringa utilizzando il formato "o" . Per esempio,

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

Produrrà:

2016-01-31T20:16:01.9092348Z

2

Funziona bene con i formati datetime delle query dell'API REST di 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

Restituisce i risultati di Salesforce senza problemi.


-6

Potresti dividere le cose, richiederebbe più codice ma funzionerebbe proprio come piace a te:

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

ect.

finalmente:

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

Questo è un modo molto audace di gestirlo però ...


Questa risposta non produce nulla come l'output desiderato
cja

Questo non ha fornito ciò che la domanda o volevo ... -1
Ziggler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.