รูปแบบวันที่ yyyy-MM-ddTHH: mm: ssZ


103

ฉันคิดว่านี่น่าจะค่อนข้างง่าย แต่ไม่สามารถเข้าใจได้ :( ในรูปแบบนี้ Z คือไทม์โซน
T คือรูปแบบเวลานาน
ฉันจะหาวันที่ในรูปแบบนี้ได้อย่างไรยกเว้นโดยใช้

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

ใน C #


1
ฉันรู้ว่าคำถามนี้มีมานาน 9 ปีแล้ว แต่คำตอบที่ได้รับการยอมรับUtcNow.ToString(s)+Zนั้นผิด ISO8601 ได้รับการสนับสนุนโดยบินToString("O")ตัวเลือก นอกจากนี้เพื่อชี้ให้เห็นว่าคำตอบที่ยอมรับนั้นใช้ค่า UTC ของวันที่และเวลาซึ่งจะให้เขตเวลา Z เสมอแทนที่จะใช้ค่าวันที่และเวลาจริงซึ่ง (ถ้า Kind = Local) อาจมีเขตเวลาออมแสง พิจารณาเปลี่ยนคำตอบที่ยอมรับหรือไม่
Richardissimo

คำตอบ:


144

ใช้ UTC

ISO 8601 ( รูปแบบวันที่และเวลา MSDN )

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

2009-11-13T10: 39: 35 ซ

Zเป็นเพราะมี

หากเวลาเป็น UTC ให้เพิ่ม 'Z' โดยตรงหลังเวลาโดยไม่ต้องเว้นวรรค 'Z' เป็นตัวกำหนดโซนสำหรับการชดเชยศูนย์ UTC ดังนั้น "09:30 UTC" จึงแสดงเป็น "09: 30Z" หรือ "0930Z" "14:45:15 UTC" จะเป็น "14: 45: 15Z" หรือ "144515Z"

หากคุณต้องการรวมค่าชดเชย

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

สองสิ่งที่ควรทราบ: จำเป็นต้องใช้ + หรือ - หลังจากช่วงเวลาดังกล่าว แต่เห็นได้ชัดว่า + ไม่แสดงในจำนวนบวก ตามวิกิพีเดียการชดเชยสามารถอยู่ในรูปแบบ + hh หรือ + hh: mm ฉันใช้เวลาเพียงไม่กี่ชั่วโมง

เท่าที่ฉันทราบRFC1123 (วันที่ HTTP ฟอร์แมตเตอร์ "u") ไม่ได้มีไว้เพื่อให้ออฟเซ็ตเขตเวลา เวลาทั้งหมดตั้งใจให้เป็น GMT / UTC


เย็น. ผลลัพธ์ของคุณไม่มีการชดเชย TZ ใช่หรือไม่?
Neil Barnwell

ฉันเพิ่มเข้าไปในเอกสารบอกว่ารูปแบบ 's' เป็นไปตาม ISO8601 ฉันไม่คิดว่ามันจะมีเขตเวลาด้วย
Chris S

แน่นอน UTC ไม่มีเขตเวลา โอ้ เขากำลังขอข้อมูลเขตเวลาในผลลัพธ์ของเขา บางที DateTimeOffset คือสิ่งที่เขากำลังมองหา?
Neil Barnwell

5
การเพิ่ม Z ด้วยตนเองนั้นไม่ดีคุณควรใช้. ToString ("o") เพราะจะทำให้คุณได้ผลลัพธ์ที่เหมาะสม ถ้ามิลลิวินาทีมีปัญหาควรปัดเศษ การเพิ่ม Z ด้วยตนเองอาจให้ผลลัพธ์ที่ไม่ถูกต้องหากคุณเพิ่มเป็นเวลาท้องถิ่นซึ่งไม่ใช่ UTC จริงๆ
Tuukka Lindroos

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

ผลลัพธ์:

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

ฉันใช้ Console.WriteLine (DateTime.Now ToString ("o")) ;. ขอบคุณ
Ziggler

5
คำตอบที่ยอมรับคือให้ใช้ตัวระบุรูปแบบ "s" และต่อท้าย Z สำหรับวันที่ UTC นั่นเป็นสิ่งที่ดีและดีถ้าคุณไม่ต้องการมิลลิวินาที แต่ถ้าคุณต้องการมิลลิวินาทีคุณต้องใช้ "o" เหมือนที่คำตอบนี้แสดง เมื่อใช้ "o" มิลลิวินาทีจะแสดงขึ้นตามค่าเริ่มต้นและ Z จะต่อท้ายสำหรับวันที่ UTC แล้ว
จิม

1
DateTime.Now ToString ("o") แก้ปัญหาทุกประเภทเพราะส่งคืนค่าชดเชยที่ถูกต้อง
Mo Zaatar

12

รูปแบบ "o" แตกต่างกันสำหรับ 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"

คำตอบสุดท้ายของฉันคือ

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

7

ใน C # 6+ คุณสามารถใช้การแก้ไขสตริงและทำให้สิ่งนี้สั้นลง:

$"{DateTime.UtcNow:s}Z"

คุณประหยัดเวลาของฉันได้มาก วิธีแก้ปัญหาที่ง่ายและน่ารัก
Raju Paladiya



5

ตัวเลือกหนึ่งอาจแปลง DateTime เป็นToUniversalTime ()ก่อนที่จะแปลงเป็นสตริงโดยใช้รูปแบบ"o" ตัวอย่างเช่น,

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

มันจะส่งออก:

2016-01-31T20:16:01.9092348Z

2

ทำงานได้ดีกับรูปแบบวันที่และเวลาของแบบสอบถาม 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

ส่งคืนผลลัพธ์จาก Salesforce โดยไม่มีปัญหาใด ๆ


-6

คุณสามารถแยกสิ่งต่างๆออกได้มันจะต้องใช้รหัสมากขึ้น แต่จะทำงานในแบบที่คุณชอบ:

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

ฯลฯ.

สุดท้าย:

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

นี่เป็นวิธีจัดการที่กล้าหาญมากแม้ว่า ...


คำตอบนี้ไม่ได้ผลลัพธ์ที่เหมือนกับผลลัพธ์ที่ต้องการ
cja

สิ่งนี้ไม่ได้ให้สิ่งที่คำถามหรือฉันต้องการ ... -1
Ziggler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.