Saya memiliki DateTime yang ingin saya format menjadi " 2009-09-01T00:00:00.000Z
", tetapi kode berikut memberi saya " 2009-09-01T00:00:00.000+01:00
" (kedua baris):
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
Ada ide bagaimana membuatnya bekerja?
.ToUniversalTime()
semua yang Anda inginkan, itu tidak akan mengubahnya. - Namun, jika Anda memiliki nilai waktu universal yang disimpan sebagai waktu lokal, maka tentu saja itu akan mengubahnya (tetapi dalam kasus ini, Anda memiliki masalah yang lebih besar untuk ditangani!) - Bagaimanapun, jawabannya adalah mengerikan. Anda harus menggunakan"O"
string format seperti yang ditentukan oleh jawaban di bawah ini.2009-09-01T00:00:00.000Z
. Menggunakan "O" specifier akan memberi mereka sesuatu yang berbeda:2009-09-01T00:00:00.0000000Z
.Mengapa tidak hanya menggunakan Penentu Format The Round-trip ("O", "o") ?
public class Example { public static void Main() { DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Unspecified); Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Utc); Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Local); Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); DateTimeOffset dto = new DateTimeOffset(lDat); Console.WriteLine("{0} --> {0:O}", dto); } } // The example displays the following output: // 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 // 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z // 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 // // 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00
sumber
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz"
bukan format Zulu.dtVariable.ToUniversalTime().ToString("o")
yang akan diubah menjadi"2019-05-26T19:50:34.4400000Z"
atau"yyyy-MM-ddTHH:mm:ss.fffffffZ"
. Catatan: Saya juga telah menguji ini dengannew Date(dtDateString).getTime()
metode Javscript dan dengan benar mengurai string tanggal yang dihasilkan oleh ini.dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")
. Sebagai catatan,"o"
tambahkan saja offset, bukan format Zulu.$"{DateTime.UtcNow:O}"
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
mengembalikan 2017-02-10T08: 12: 39.483Z
sumber
fff
alih-alihFFF
atau 000 tidak akan ditampilkan sedetik pun tepat pada tanda.Format terbaik untuk digunakan adalah "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffK".
K terakhir pada string akan diubah menjadi 'Z' jika tanggalnya UTC atau dengan zona waktu (+ -hh: mm) jika lokal. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )
Seperti yang dikatakan LukeH, sebaiknya gunakan ToUniversalTime jika Anda ingin semua tanggalnya UTC.
Kode terakhirnya adalah:
string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
sumber
Beberapa orang telah menunjukkan bahwa 'ToUniversalTime' agak tidak aman karena dapat menyebabkan penyebaran waktu yang salah yang tidak diinginkan. Memperluas itu saya memberikan contoh solusi yang lebih rinci. Contoh di sini membuat ekstensi ke objek DateTime yang mengembalikan DateTime UTC dengan aman di mana Anda dapat menggunakan ToString sesuai keinginan….
class Program { static void Main(string[] args) { DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); //Sample of an unintended mangle: //Prints "2016-06-01 10:17:00Z" Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUtc.SafeUniversal().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); } } public static class ConvertExtensions { public static DateTime SafeUniversal(this DateTime inTime) { return (DateTimeKind.Unspecified == inTime.Kind) ? new DateTime(inTime.Ticks, DateTimeKind.Utc) : inTime.ToUniversalTime(); } }
sumber
Anda ingin menggunakan kelas DateTimeOffset .
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u");
maaf saya melewatkan format asli Anda dengan milidetik
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
sumber
Kode ini berfungsi untuk saya:
var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); var text = datetime.ToString("o"); Console.WriteLine(text); -- 2017-10-27T14:45:53.1750000+03:00 // datetime from string var newDate = DateTime.ParseExact(text, "o", null);
sumber
Coba ini:
DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture);
Pertanyaan sebelumnya
sumber