हालाँकि 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 स्ट्रिंग्स (I do) को पार्स करने में कोई आपत्ति नहीं है, तो आप कवर किए गए प्रारूप परिवर्तनों की संख्या को बढ़ाने के लिए "s" लाइन जोड़ सकते हैं।