Dany:
DateTime.UtcNow
Jak uzyskać ciąg reprezentujący tę samą wartość w formacie zgodnym z ISO 8601 ?
Należy pamiętać, że ISO 8601 definiuje wiele podobnych formatów. Konkretny format, którego szukam to:
yyyy-MM-ddTHH:mm:ssZ
Uwaga dla czytelników: Kilku komentatorów wskazało pewne problemy w tej odpowiedzi (związane szczególnie z pierwszą sugestią). Więcej informacji znajduje się w sekcji komentarzy.
DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");
To daje datę podobną do 2008-09-22T13: 57: 31.2311892-04: 00 .
Innym sposobem jest:
DateTime.UtcNow.ToString("o");
co daje 2008-09-22T14: 01: 54.9571247Z
Aby uzyskać określony format, możesz użyć:
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
ToString("yyyy-MM-ddTHH:mm:ssK")
tego do pracy (z używaną przeze mnie wtyczką timeago jago).dt.ToString("s") + dt.ToString("zzz")
// 2013-12-05T07: 19: 04-08: 00DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
powinien dać ci to, czego szukasz, ponieważ specyfikator formatu „s” jest opisany jako sortowalny wzorzec daty / godziny; zgodny z ISO 8601.źródło
DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern);
Jednakże, ponieważ wszystkie z nich wykluczyć strefę czasową, etc., może nie masz wyboru, ale na wyraźne formatowania, czyli"yyyy-MM-ddTHH:mm:ss.fffZ"
Z
wygląda tak:DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36
nie ma żadnej milisekundowej rozdzielczości, która byłaby bardzo miła, ponieważ komputery wykonują sporą liczbę tyknięć na sekundę.o
masz2012-06-26T11:55:36.1007668Z
czyli36.1007668
sekund, więc masz rozdzielczość aż do1/10^7
sekundy. Od ISO8601: 2004If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
"s"
nie ma sensu, ponieważ: „„ O ”(lub„ o ”),„ R ”(lub„ r ”),„ s ”i„ u ”. Ciągi te odpowiadają ciągom formatu niestandardowego zdefiniowanym przez niezmienną kulturę. Tworzą ciąg reprezentujący wartości daty i godziny, które mają być identyczne w różnych kulturach. ”DateTime.Now.ToString("s", new CultureInfo(myCulture))
.Zwraca coś w rodzaju 2008-04-10T06: 30: 00
UtcNow
oczywiście zwraca czas UTC, więc nie ma szkody w:źródło
a + b
kompiluje się do tego samego kodu pośredniego costring.Concat(a, b)
(zakładając, że aib są ciągami, oczywiście), więc nie ma różnicy w wydajności lub zużyciu pamięci.Posługiwać się:
WYNIK
Źródła:
Standardowe ciągi formatu daty i godziny (MSDN)
Niestandardowe ciągi formatu daty i godziny (MSDN)
źródło
string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");
spowoduje:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
=>
źródło
Możesz uzyskać „Z” ( ISO 8601 UTC ) z następnym kodem:
Oto dlaczego:
ISO 8601 ma kilka różnych formatów:
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Unspecified
.NET zapewnia nam wyliczenie z tymi opcjami:
Uwaga : w przypadku zastosowania programu „Watch Utility” programu Visual Studio 2008 do metody toString („o”) , możesz uzyskać różne wyniki, nie wiem, czy to błąd, ale w tym przypadku masz lepsze wyniki przy użyciu zmiennej String jeśli debugujesz.
Źródło: Standardowe ciągi formatu daty i godziny (MSDN)
źródło
Jeśli musisz użyć DateTime zgodnie z ISO 8601, to ToString („o”) powinno dać to, czego szukasz. Na przykład,
Jednak DateTime + TimeZone może powodować inne problemy opisane w poście na blogu DateTime i DateTimeOffset w .NET: Dobre praktyki i typowe pułapki :
źródło
Zaskoczony, że nikt tego nie sugerował:
UniversalSortableDateTimePattern dostaje prawie całą drogę do tego, co chcesz (co jest bardziej RFC 3339 reprezentacja).
Dodano: postanowiłem użyć testów porównawczych, które były w odpowiedzi https://stackoverflow.com/a/43793679/653058, aby porównać, jak to działa.
tl: dr; jest na drogim końcu, ale wciąż trochę ponad pół milisekundy na moim gównianym starym laptopie :-)
Realizacja:
Wyniki:
źródło
Po prostu użyłbym
XmlConvert
:Automatycznie zachowa strefę czasową.
źródło
Większość tych odpowiedzi ma milisekundy / mikrosekundy, co oczywiście nie jest obsługiwane przez ISO 8601. Prawidłowa odpowiedź to:
Bibliografia:
źródło
UWAGA: W zależności od konwersji, którą wykonujesz na swoim końcu, będziesz używać pierwszej linii (najbardziej podobnej) lub drugiej.
Zastosuj format tylko w czasie lokalnym, ponieważ „zzz” to informacja o strefie czasowej dla konwersji UTC.
źródło
- z MSDN
źródło
.ToString("s")
?Aby przekonwertować DateTime.UtcNow na reprezentację ciągu rrrr-MM-ddTHH: mm: ssZ , można użyć metody ToString () struktury DateTime z niestandardowym ciągiem formatującym. Podczas korzystania z ciągów formatu niestandardowego z funkcją DateTime należy pamiętać, że trzeba uciec od separatorów za pomocą pojedynczych cudzysłowów.
Następujące polecenie zwróci żądaną reprezentację ciągu:
źródło
Interesujące jest to, że niestandardowy format „rrrr-MM-ddTHH: mm: ssK” (bez ms) jest najszybszą metodą formatowania.
Interesujące jest również to, że format „S” jest wolny w wersji Classic i szybki w Core ...
Oczywiście liczby są bardzo bliskie, różnica między niektórymi wierszami jest nieznaczna (testy z sufiksem
_Verify
są takie same, jak te bez sufiksu, wykazują powtarzalność wyników)Kod:
Wykorzystano https://github.com/dotnet/BenchmarkDotNet
źródło
Korzystając z Newtonsoft.Json, możesz to zrobić
Przykład: https://dotnetfiddle.net/O2xFSl
źródło
Jeśli tworzysz program SharePoint 2010 lub nowszy, możesz go używać
źródło
.ToString("o")
lub lepiej$"My complicated string {dt:o}"
.Aby sformatować jak 2018-06-22T13: 04: 16, które można przekazać w identyfikatorze URI interfejsu API, należy:
źródło
Jak wspomniano w innej odpowiedzi,
DateTime
ma problemy z projektowaniem.NodaTime
Sugeruję używać NodaTime do zarządzania wartościami daty / godziny:
Formatowanie
Aby utworzyć i sformatować
ZonedDateTime
, możesz użyć następującego fragmentu kodu:Dla mnie
NodaTime
kod wygląda dość gadatliwie. Ale typy są naprawdę przydatne. Pomagają w prawidłowym przetwarzaniu wartości daty / godziny.Newtonsoft.Json
źródło