format tanggal tttt-BB-hhTJJ: mm: ssZ


102

Saya berasumsi ini seharusnya cukup sederhana, tetapi tidak bisa mendapatkannya :(. Dalam format ini Z adalah zona waktu.
T adalah pola waktu lama
Bagaimana saya bisa mendapatkan tanggal dalam format ini kecuali dengan menggunakan

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

di C #


Saya tahu pertanyaan ini telah ada selama 9 tahun tetapi jawaban yang diterima UtcNow.ToString(s)+Zadalah salah. ISO8601 didukung oleh opsi RoundTripToString("O") . Juga untuk menunjukkan bahwa jawaban yang diterima menggunakan nilai UTC dari datetime, yang akan selalu memberikan zona waktu Z, daripada hanya menggunakan nilai datetime aktual, yang (jika Kind = Local) mungkin berisi zona waktu musim panas. Pertimbangkan untuk mengubah jawaban yang diterima?
Richardissimo

Jawaban:


144

Menggunakan UTC

ISO 8601 ( format tanggal waktu MSDN )

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

2009-11-13T10: 39: 35Z

The Z ada karena

Jika waktunya dalam UTC, tambahkan 'Z' langsung setelah waktu tanpa spasi. 'Z' adalah penanda zona untuk offset UTC nol. Oleh karena itu, "09:30 UTC" direpresentasikan sebagai "09: 30Z" atau "0930Z". "14:45:15 UTC" akan menjadi "14: 45: 15Z" atau "144515Z".

Jika Anda ingin memasukkan 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);

Dua hal yang perlu diperhatikan: + atau - diperlukan setelah waktu tetapi jelas + tidak ditampilkan pada bilangan positif. Menurut wikipedia, offset bisa dalam format + hh atau + hh: mm. Saya telah menyimpannya hanya beberapa jam.

Sejauh yang saya tahu, RFC1123 (tanggal HTTP, pemformat "u") tidak dimaksudkan untuk memberikan offset zona waktu. Semua waktu dimaksudkan untuk GMT / UTC.


Keren. Output Anda tidak termasuk offset TZ?
Neil Barnwell

Saya menambahkannya di - dokumen mengatakan bahwa format itu didasarkan pada ISO8601. Saya tidak berpikir ini termasuk zona waktu.
Chris S

Oh tentu saja, UTC tidak memiliki zona waktu. D'oh. Dia meminta info zona waktu dalam keluarannya. Mungkin DateTimeOffset yang dia cari?
Neil Barnwell

5
Menambahkan Z di sana secara manual tidak baik, Anda harus menggunakan .ToString ("o") karena itu akan memberi Anda output yang tepat. Jika milidetik menjadi masalah, mereka harus dibulatkan. Menambahkan Z secara manual dapat memberikan hasil yang salah jika Anda menambahkannya ke waktu lokal, yang sebenarnya bukan UTC.
Tuukka Lindroos

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Keluaran:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

Saya menggunakan Console.WriteLine (DateTime.Now.ToString ("o")) ;. Terima kasih
Ziggler

5
Jawaban yang diterima mengatakan untuk menggunakan penentu format "s" dan menambahkan Z di akhir untuk tanggal UTC. Itu semua bagus dan bagus jika Anda tidak memerlukan milidetik, tetapi jika Anda menginginkan milidetik, Anda harus menggunakan "o" seperti yang ditunjukkan jawaban ini. Dengan "o", milidetik muncul secara default dan Z sudah ditambahkan di akhir untuk tanggal UTC.
Jim

1
DateTime.Now.ToString ("o") Memecahkan semua jenis masalah karena mengembalikan offset yang benar dengannya.
Mo Zaatar

12

Format "o" berbeda untuk 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"

Jawaban terakhir saya adalah

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

Di C # 6+ Anda dapat menggunakan interpolasi string dan membuatnya lebih singkat:

$"{DateTime.UtcNow:s}Z"

Anda menghemat banyak waktu saya. Solusi sederhana dan manis.
Raju Paladiya

6

Lihat di sini pola "u" dan "s". Pertama tanpa pemisah 'T', dan yang kedua tanpa akhiran zona waktu.



5

Salah satu opsi dapat mengubah DateTime ke ToUniversalTime () sebelum mengonversi ke string menggunakan format "o" . Sebagai contoh,

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

Ini akan menampilkan:

2016-01-31T20:16:01.9092348Z

2

Ini berfungsi dengan baik dengan format tanggal waktu kueri Salesforce REST API

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

Ini mengembalikan hasil dari Salesforce tanpa masalah apa pun.


-6

Anda dapat memecahnya, itu akan membutuhkan lebih banyak kode tetapi akan bekerja sesuai keinginan Anda:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

dll.

akhirnya:

Console.WriteLine(year+month+day+etc.);

Ini adalah cara yang sangat berani untuk menanganinya ...


Jawaban ini tidak menghasilkan keluaran yang diinginkan
cja

Ini tidak memberikan pertanyaan atau yang saya inginkan ... -1
Ziggler
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.