แม้ว่า MSDN จะบอกว่ารูปแบบ "s" และ "o" นั้นสะท้อนถึงมาตรฐาน แต่ดูเหมือนว่าพวกเขาจะสามารถแยกวิเคราะห์ได้เพียงบางส่วนเท่านั้น โดยเฉพาะอย่างยิ่งมันเป็นปัญหาถ้าสตริงมีข้อกำหนดของเขตเวลา (ไม่ใช่สำหรับรูปแบบ ISO8601 พื้นฐานหรือรูปแบบความแม่นยำลดลง แต่นี่ไม่ใช่กรณีของคุณ) นั่นคือเหตุผลที่ฉันใช้ประโยชน์จากรูปแบบสตริงที่กำหนดเองเมื่อพูดถึงการแยก ISO8601 ขณะนี้ตัวอย่างที่ฉันต้องการคือ:
static readonly string[] formats = {
// Basic formats
"yyyyMMddTHHmmsszzz",
"yyyyMMddTHHmmsszz",
"yyyyMMddTHHmmssZ",
// Extended formats
"yyyy-MM-ddTHH:mm:sszzz",
"yyyy-MM-ddTHH:mm:sszz",
"yyyy-MM-ddTHH:mm:ssZ",
// All of the above with reduced accuracy
"yyyyMMddTHHmmzzz",
"yyyyMMddTHHmmzz",
"yyyyMMddTHHmmZ",
"yyyy-MM-ddTHH:mmzzz",
"yyyy-MM-ddTHH:mmzz",
"yyyy-MM-ddTHH:mmZ",
// Accuracy reduced to hours
"yyyyMMddTHHzzz",
"yyyyMMddTHHzz",
"yyyyMMddTHHZ",
"yyyy-MM-ddTHHzzz",
"yyyy-MM-ddTHHzz",
"yyyy-MM-ddTHHZ"
};
public static DateTime ParseISO8601String ( string str )
{
return DateTime.ParseExact ( str, formats,
CultureInfo.InvariantCulture, DateTimeStyles.None );
}
หากคุณไม่ได้แยกวิเคราะห์สตริง TZ-less (ฉันทำ) คุณสามารถเพิ่มบรรทัด "s" เพื่อขยายจำนวนการเปลี่ยนแปลงรูปแบบที่ครอบคลุม