Diberikan:
DateTime.UtcNow
Bagaimana cara mendapatkan string yang mewakili nilai yang sama dalam sebuah ISO 8601 ?
Perhatikan bahwa ISO 8601 mendefinisikan sejumlah format serupa. Format spesifik yang saya cari adalah:
yyyy-MM-ddTHH:mm:ssZ
Catatan untuk pembaca: Beberapa komentator telah menunjukkan beberapa masalah dalam jawaban ini (terutama terkait dengan saran pertama). Lihat bagian komentar untuk informasi lebih lanjut.
DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");
Ini memberi Anda tanggal yang mirip dengan 2008-09-22T13: 57: 31.2311892-04: 00 .
Cara lain adalah:
DateTime.UtcNow.ToString("o");
yang memberi Anda 2008-09-22T14: 01: 54.9571247Z
Untuk mendapatkan format yang ditentukan, Anda dapat menggunakan:
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
ToString("yyyy-MM-ddTHH:mm:ssK")
ini agar berfungsi (dengan plugin jquery timeago yang saya gunakan).dt.ToString("s") + dt.ToString("zzz")
// 2013-12-05T07: 19: 04-08: 00DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
harus memberi Anda apa yang Anda cari karena specifier format "s" digambarkan sebagai pola tanggal / waktu yang dapat diurutkan; sesuai dengan ISO 8601.sumber
DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern);
Namun, karena semua ini mengecualikan zona waktu, dll., Anda mungkin tidak punya pilihan selain menggunakan formatter eksplisit, yaitu"yyyy-MM-ddTHH:mm:ss.fffZ"
Z
tampak seperti ini:DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36
dan tidak ada resolusi milidetik yang sangat baik untuk dimiliki karena komputer melakukan cukup banyak kutu per detik.o
Anda mendapatkan detik yang2012-06-26T11:55:36.1007668Z
berarti36.1007668
, sehingga Anda mendapatkan resolusi hingga1/10^7
satu detik. Dari 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"
tidak masuk akal karena: "" O "(atau" o ")," R "(atau" r ")," s ", dan" u ". String ini sesuai dengan string format kustom yang ditentukan oleh budaya invarian. Mereka menghasilkan representasi string dari nilai tanggal dan waktu yang dimaksudkan untuk identik lintas budaya. "DateTime.Now.ToString("s", new CultureInfo(myCulture))
.Mengembalikan sesuatu seperti 2008-04-10T06: 30: 00
UtcNow
jelas mengembalikan waktu UTC sehingga tidak ada salahnya di:sumber
a + b
mengkompilasi ke kode perantara yang sama sepertistring.Concat(a, b)
(dengan asumsi bahwa a dan b adalah string, tentu saja) sehingga tidak ada perbedaan dalam kinerja atau konsumsi memori.Menggunakan:
KELUARAN
Sumber:
String Format Tanggal dan Waktu Standar (MSDN)
String Format Tanggal dan Waktu Kustom (MSDN)
sumber
string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");
akan menghasilkan:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
o
adalah format ISO-8601.=>
sumber
Anda bisa mendapatkan "Z" ( ISO 8601 UTC ) dengan kode berikut:
Inilah alasannya:
ISO 8601 memiliki beberapa format berbeda:
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Unspecified
.NET memberi kami enum dengan opsi-opsi itu:
Catatan : Jika Anda menerapkan Visual Studio 2008 "utilitas menonton" ke bagian toString ("o") Anda mungkin mendapatkan hasil yang berbeda, saya tidak tahu apakah itu bug, tetapi dalam hal ini Anda memiliki hasil yang lebih baik menggunakan variabel String jika Anda men-debug.
Sumber: String Format Tanggal dan Waktu Standar (MSDN)
sumber
Jika Anda harus menggunakan DateTime ke ISO 8601, maka ToString ("o") harus menghasilkan apa yang Anda cari. Sebagai contoh,
Namun, DateTime + TimeZone dapat menyajikan masalah lain seperti yang dijelaskan dalam posting blog DateTime dan DateTimeOffset di .NET: Praktik yang baik dan perangkap umum :
sumber
Terkejut bahwa tidak ada yang menyarankannya:
The UniversalSortableDateTimePattern membuat Anda hampir semua jalan ke apa yang Anda inginkan (yang lebih merupakan RFC 3339 representasi).
Ditambahkan: Saya memutuskan untuk menggunakan tolok ukur yang ada dalam jawaban https://stackoverflow.com/a/43793679/653058 untuk membandingkan bagaimana kinerjanya.
tl: dr; itu pada akhir mahal tapi masih hanya sedikit lebih dari setengah milidetik pada laptop lama jelek saya :-)
Penerapan:
Hasil:
sumber
Saya hanya akan menggunakan
XmlConvert
:Ini akan secara otomatis mempertahankan zona waktu.
sumber
Sebagian besar jawaban ini memiliki milidetik / mikrodetik yang jelas tidak didukung oleh ISO 8601. Jawaban yang benar adalah:
Referensi:
sumber
CATATAN: Bergantung pada konversi yang Anda lakukan di pihak Anda, Anda akan menggunakan baris pertama (paling mirip) atau yang kedua.
Pastikan untuk menerapkan format hanya pada waktu lokal, karena "zzz" adalah informasi zona waktu untuk konversi UTC.
sumber
- dari MSDN
sumber
.ToString("s")
?Untuk mengonversi DateTime.UtcNow ke representasi string dari yyyy-MM-ddTHH: mm: ssZ , Anda dapat menggunakan metode ToString () dari struktur DateTime dengan string pemformatan kustom. Saat menggunakan string format khusus dengan DateTime, penting untuk diingat bahwa Anda perlu melarikan diri dari pemisah Anda menggunakan tanda kutip tunggal.
Berikut ini akan mengembalikan string yang Anda inginkan:
sumber
Sangat menarik bahwa format khusus "yyyy-MM-ddTHH: mm: ssK" (tanpa ms) adalah metode format tercepat.
Juga menarik bahwa format "S" lambat pada Classic dan cepat pada Core ...
Tentu saja angka sangat dekat, antara beberapa perbedaan baris tidak signifikan (tes dengan sufiks
_Verify
sama dengan yang tanpa sufiks, menunjukkan hasil pengulangan)Kode:
https://github.com/dotnet/BenchmarkDotNet digunakan
sumber
Menggunakan Newtonsoft.Json, Anda bisa melakukannya
Contoh: https://dotnetfiddle.net/O2xFSl
sumber
Jika Anda mengembangkan di bawah SharePoint 2010 atau lebih tinggi, Anda dapat menggunakan
sumber
.ToString("o")
atau, lebih baik$"My complicated string {dt:o}"
,.Untuk memformat seperti 2018-06-22T13: 04: 16 yang dapat diteruskan dalam URI penggunaan API:
sumber
Seperti disebutkan dalam jawaban lain,
DateTime
ada masalah dengan desain.NodaTime
Saya sarankan untuk menggunakan NodaTime untuk mengelola nilai tanggal / waktu:
Memformat
Jadi, untuk membuat dan memformat
ZonedDateTime
Anda dapat menggunakan potongan kode berikut:Bagi saya
NodaTime
kode terlihat cukup verbose. Tetapi tipe sangat berguna. Mereka membantu menangani nilai tanggal / waktu dengan benar.Newtonsoft.Json
sumber