Odpowiedzi:
ISO 8601 ( formaty daty i godziny MSDN )
Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");
2009-11-13T10: 39: 35Z
Z jest tam, ponieważ
Jeśli czas jest w UTC, dodaj „Z” bezpośrednio po godzinie bez spacji. „Z” jest oznaczeniem strefy dla zerowego przesunięcia czasu UTC. Dlatego „09:30 UTC” jest przedstawiane jako „09: 30Z” lub „0930Z”. „14:45:15 UTC” to „14:45: 15Z” lub „144515Z”.
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);
Dwie rzeczy do zapamiętania: + lub - jest potrzebne po czasie, ale oczywiście + nie pojawia się na liczbach dodatnich. Według Wikipedii offset może mieć format + hh lub + hh: mm. Mam tylko kilka godzin.
O ile mi wiadomo, RFC1123 (data HTTP, formatowanie "u") nie ma na celu podawania przesunięć stref czasowych. Wszystkie godziny są podane w GMT / UTC.
Console.WriteLine(DateTime.UtcNow.ToString("o"));
Console.WriteLine(DateTime.Now.ToString("o"));
Wyjścia:
2012-07-09T19:22:09.1440844Z
2012-07-09T12:22:09.1440844-07:00
Format „o” jest inny dla DateTime i DateTimeOffset :(
DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"
DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"
Moja ostateczna odpowiedź brzmi
DateTimeOffset.UtcDateTime.ToString("o") //for DateTimeOffset type
DateTime.UtcNow.ToString("o") //for DateTime type
W C # 6+ możesz użyć interpolacji ciągów i uczynić to bardziej zwięzłym:
$"{DateTime.UtcNow:s}Z"
Spójrz tutaj na wzory „u” i „s”. Pierwsza jest bez separatora „T”, a druga bez sufiksu strefy czasowej.
Kod jednowierszowy do tego.
var temp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");
Działa dobrze z formatami daty i godziny zapytań interfejsu 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
Zwraca wyniki z Salesforce bez żadnych problemów.
Możesz podzielić rzeczy, wymagałoby to więcej kodu, ale działałoby tak, jak lubisz:
DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;
ect.
Wreszcie:
Console.WriteLine(year+month+day+etc.);
Jest to jednak bardzo odważny sposób radzenia sobie z tym ...
UtcNow.ToString(s)+Zjest zła. ISO8601 jest obsługiwany przez opcję RoundTripToString("O"). Należy również zwrócić uwagę, że zaakceptowana odpowiedź wykorzystuje wartość UTC daty i godziny, która zawsze podaje strefę czasową Z, a nie tylko rzeczywistą wartość daty i godziny, która (jeśli Kind = Local) może zawierać strefę czasową czasu letniego. Rozważ zmianę zaakceptowanej odpowiedzi?