formato data yyyy-MM-ddTHH: mm: ssZ

Presumo che questo dovrebbe essere abbastanza semplice, ma non è stato ansible ottenerlo :(. In questo formato Z è il fuso orario.
T è un modello 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 #

Usando UTC

ISO 8601 ( formati datetime MSDN )

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

2009-11-13T10: 39: 35Z

La Z è lì perché

Se il tempo è in UTC, aggiungi una “Z” immediatamente dopo il tempo senza spazio. ‘Z’ è il designatore di zona per lo zero UTC offset. “09:30 UTC” viene quindi rappresentato come “09: 30Z” o “0930Z”. “14:45:15 UTC” sarebbe “14: 45: 15Z” o “144515Z”.

Se si desidera 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 + non viene mostrato 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 è pensato per fornire offset del fuso orario. Tutti i tempi sono intesi come GMT / UTC.

 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 

Il formato “o” è diverso per DateTime vs 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 

Guarda qui i modelli “u” e “s”. Il primo è senza separatore “T”, mentre il secondo è senza suffisso timezone.

Un’opzione potrebbe essere la conversione di DateTime in ToUniversalTime () prima di convertirla in string usando il formato “o” . Per esempio,

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

Produrrà:

 2016-01-31T20:16:01.9092348Z 

Codice a riga singola per questo.

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

Funziona perfettamente con i formati datetime delle query dell’API di Salesforce REST

 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 da Salesforce senza problemi.

In C # 6+ è ansible utilizzare l’interpolazione delle stringhe e renderla più concisa:

 $"{DateTime.UtcNow:s}Z" 

Potresti dividere le cose, richiederebbe più codice ma funzionerebbe nel modo che preferisci:

 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 anche se …