ฉันคิดว่านี่น่าจะค่อนข้างง่าย แต่ไม่สามารถเข้าใจได้ :( ในรูปแบบนี้ Z คือไทม์โซน
T คือรูปแบบเวลานาน
ฉันจะหาวันที่ในรูปแบบนี้ได้อย่างไรยกเว้นโดยใช้
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));
ใน C #
ฉันคิดว่านี่น่าจะค่อนข้างง่าย แต่ไม่สามารถเข้าใจได้ :( ในรูปแบบนี้ Z คือไทม์โซน
T คือรูปแบบเวลานาน
ฉันจะหาวันที่ในรูปแบบนี้ได้อย่างไรยกเว้นโดยใช้
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));
ใน C #
คำตอบ:
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
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
รูปแบบ "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
ใน C # 6+ คุณสามารถใช้การแก้ไขสตริงและทำให้สิ่งนี้สั้นลง:
$"{DateTime.UtcNow:s}Z"
ดูที่นี่ที่ "U" และ "S" รูปแบบ อันดับแรกไม่มีตัวคั่น 'T' และอันที่สองไม่มีส่วนต่อท้ายเขตเวลา
รหัสบรรทัดเดียวสำหรับสิ่งนี้
var temp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");
ตัวเลือกหนึ่งอาจแปลง DateTime เป็นToUniversalTime ()ก่อนที่จะแปลงเป็นสตริงโดยใช้รูปแบบ"o" ตัวอย่างเช่น,
var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));
มันจะส่งออก:
2016-01-31T20:16:01.9092348Z
ทำงานได้ดีกับรูปแบบวันที่และเวลาของแบบสอบถาม 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 โดยไม่มีปัญหาใด ๆ
คุณสามารถแยกสิ่งต่างๆออกได้มันจะต้องใช้รหัสมากขึ้น แต่จะทำงานในแบบที่คุณชอบ:
DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;
ฯลฯ.
สุดท้าย:
Console.WriteLine(year+month+day+etc.);
นี่เป็นวิธีจัดการที่กล้าหาญมากแม้ว่า ...
UtcNow.ToString(s)+Zนั้นผิด ISO8601 ได้รับการสนับสนุนโดยบินToString("O")ตัวเลือก นอกจากนี้เพื่อชี้ให้เห็นว่าคำตอบที่ยอมรับนั้นใช้ค่า UTC ของวันที่และเวลาซึ่งจะให้เขตเวลา Z เสมอแทนที่จะใช้ค่าวันที่และเวลาจริงซึ่ง (ถ้า Kind = Local) อาจมีเขตเวลาออมแสง พิจารณาเปลี่ยนคำตอบที่ยอมรับหรือไม่