format daty rrrr-MM-ddTHH: mm: ssZ


102

Zakładam, że powinno to być dość proste, ale nie można tego uzyskać :(. W tym formacie Z to strefa czasowa.
T to wzorzec długi czas
Jak mogę uzyskać datę w tym formacie, z wyjątkiem użycia

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

w C #


Wiem, że to pytanie istnieje od 9 lat, ale przyjęta odpowiedź 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?
Richardissimo

Odpowiedzi:


144

Korzystanie z UTC

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”.

Jeśli chcesz dołączyć przesunięcie

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.


Chłodny. Twój wynik nie zawiera jednak przesunięcia TZ?
Neil Barnwell

Dodałem to w - dokumentacja mówi, że format 's' jest oparty na ISO8601, nie sądzę, aby zawierał strefę czasową.
Chris S

Oczywiście UTC nie ma stref czasowych. D'oh. Prosi o informacje o strefie czasowej w swoim wyjściu. Może DateTimeOffset jest tym, czego szuka?
Neil Barnwell

5
Ręczne dodanie Z nie jest dobre, powinieneś użyć .ToString ("o"), ponieważ da ci to właściwe wyjście. Jeśli problem stanowią milisekundy, należy je zaokrąglić. Ręczne dodanie Z może dać niepoprawny wynik, jeśli dodasz go do czasu lokalnego, który tak naprawdę nie jest UTC.
Tuukka Lindroos

67
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

Użyłem Console.WriteLine (DateTime.Now.ToString ("o")) ;. Dzięki
Ziggler

5
Zaakceptowana odpowiedź mówi, że należy użyć specyfikatora formatu „s” i dołączyć na końcu Z dla dat UTC. To wszystko dobrze i dobrze, jeśli nie potrzebujesz milisekund, ale jeśli chcesz milisekund, musisz użyć „o”, tak jak pokazuje ta odpowiedź. W przypadku „o” milisekundy pojawiają się domyślnie, a litera Z jest już dodana na końcu dla dat UTC.
Jim

1
DateTime.Now.ToString ("o") Rozwiązuje wszelkiego rodzaju problemy, ponieważ wraz z nim zwraca właściwe przesunięcie.
Mo Zaatar

12

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

7

W C # 6+ możesz użyć interpolacji ciągów i uczynić to bardziej zwięzłym:

$"{DateTime.UtcNow:s}Z"

zaoszczędziłeś mi czasu. Proste i słodkie rozwiązanie.
Raju Paladiya

6

Spójrz tutaj na wzory „u” i „s”. Pierwsza jest bez separatora „T”, a druga bez sufiksu strefy czasowej.



5

Jedną z opcji może być przekonwertowanie DateTime na ToUniversalTime () przed konwersją na łańcuch znaków przy użyciu formatu „o” . Na przykład,

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

Wyświetli:

2016-01-31T20:16:01.9092348Z

2

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.


-6

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 ...


Ta odpowiedź nie daje nic podobnego do pożądanego wyniku
cja

To nie odpowiadało na pytanie, czy chciałem ... -1
Ziggler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.