tarih biçimi yyyy-AA-ggTHH: mm: ssZ


103

Bunun oldukça basit olduğunu varsayıyorum, ancak anlayamadım :(. Bu formatta Z, saat dilimidir.
T uzun zaman kalıbıdır
Bu formatta, kullanmanın dışında nasıl bir tarih alabilirim

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

C #


1
Bu sorunun 9 yıldır ortalıkta olduğunu biliyorum ama kabul edilen cevap UtcNow.ToString(s)+Zyanlış olan. ISO8601 tarafından desteklenen gidiş dönüş seçeneği ToString("O"). Ayrıca kabul edilen cevabın, sadece gerçek tarih saat değerini kullanmak yerine (Tür = Yerel ise) bir gün ışığından yararlanma saat dilimi içerebilen, her zaman Z saat dilimini veren tarih saatinin UTC değerini kullandığını belirtmek için. Kabul edilen cevabı değiştirmeyi düşünüyor musunuz?
Richardissimo

Yanıtlar:


144

UTC kullanarak

ISO 8601 ( MSDN tarih saat biçimleri )

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

2009-11-13T10: 39: 35Z

Z orada çünkü

Zaman UTC ise, boşluk olmadan zamandan hemen sonra bir 'Z' ekleyin. 'Z', sıfır UTC sapması için bölge göstergesidir. "09:30 UTC" bu nedenle "09: 30Z" veya "0930Z" olarak temsil edilir. "14:45:15 UTC", "14: 45: 15Z" veya "144515Z" olacaktır.

Bir ofset eklemek istiyorsanız

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);

Unutulmaması gereken iki nokta: + veya - zaman geçtikten sonra gereklidir, ancak açıkça + pozitif sayılarda gösterilmez. Wikipedia'ya göre ofset + hh formatında veya + hh: mm olabilir. Sadece saatlerce tuttum.

Bildiğim kadarıyla, RFC1123 (HTTP tarihi, "u" biçimlendiricisi) saat dilimi farklarını verme amacı taşımıyor . Tüm saatler GMT / UTC olarak tasarlanmıştır.


Güzel. Çıktınız TZ ofsetini içermiyor mu?
Neil Barnwell

Onu ekledim - dokümanlar 's' formatının ISO8601'e dayandığını söylüyor . Saat dilimini içerdiğini sanmıyorum.
Chris S

Elbette, UTC'nin saat dilimleri yoktur. D'oh. Çıktısında saat dilimi bilgisi istiyor. Belki de DateTimeOffset aradığı şeydir?
Neil Barnwell

5
Buraya elle Z eklemek iyi değildir, .ToString ("o") kullanmalısınız çünkü size uygun çıktıyı verecektir. Milisaniyeler sorun oluşturuyorsa, yuvarlatılmalıdır. Z'yi manuel olarak eklemek, yerel saate eklerseniz yanlış sonuç verebilir, ki bu gerçekten UTC değildir.
Tuukka Lindroos

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

Çıktılar:

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

Console.WriteLine (DateTime.Now.ToString ("o")); kullandım. Teşekkürler
Ziggler

5
Kabul edilen yanıt, "s" biçim belirleyicisini kullanmayı ve UTC tarihlerinin sonuna bir Z eklemeyi söyler. Milisaniyelere ihtiyacınız yoksa hepsi iyi ve iyi, ancak milisaniyeleri istiyorsanız, bu cevabın gösterdiği gibi "o" kullanmanız gerekir. "O" ile, milisaniyeler varsayılan olarak görünür ve Z, UTC tarihlerinin sonuna zaten eklenir.
Jim

1
DateTime.Now.ToString ("o") Onunla birlikte doğru ofseti döndürdüğü için her türlü sorunu çözer.
Mo Zaatar

12

"o" biçimi DateTime ve DateTimeOffset için farklıdır :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Son cevabım

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

7

C # 6 + 'da dize enterpolasyonunu kullanabilir ve bunu daha kısa hale getirebilirsiniz:

$"{DateTime.UtcNow:s}Z"

çok zamanımı kurtardın. Basit ve tatlı çözüm.
Raju Paladiya

6

Bakın burada "u" ve "s" kalıplarına. Birincisi 'T' ayırıcısı yok ve ikincisi saat dilimi son eki yok.



5

Bir seçenek, "o" biçimini kullanarak dizeye dönüştürmeden önce DateTime'ı ToUniversalTime () 'a dönüştürmek olabilir. Örneğin,

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

Çıktı:

2016-01-31T20:16:01.9092348Z

2

Salesforce REST API sorgu tarih saat biçimleriyle sorunsuz çalışır

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

Salesforce'tan sonuçları herhangi bir sorun olmadan döndürür.


-6

İşleri bölebilirsiniz, daha fazla kod gerektirir, ancak tam istediğiniz şekilde çalışır:

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

vb.

en sonunda:

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

Yine de bu çok cesur bir yöntem ...


Bu cevap istenen çıktıya benzemiyor
cja 24'14

Bu soruyu vermedi ya da ben istediğim ... -1
Ziggler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.