কীভাবে আইএসও 8601 ফর্ম্যাট থেকে .NET তারিখটাইম তৈরি করবেন


130

আমি ডেটটাইমকে কীভাবে আইএসও 8601 ফর্ম্যাটে রূপান্তর করতে পারি তা খুঁজে পেয়েছি , তবে সি # তে বিপরীত কীভাবে করবেন তা কিছুই নয় nothing

আমার আছে 2010-08-20T15:00:00Z, এবং আমি এটি একটি DateTimeবস্তুতে পরিণত করতে চাই ।

আমি নিজেই স্ট্রিংয়ের অংশগুলি পৃথক করতে পারতাম, তবে মনে হয় এমন কিছু কাজ করার জন্য যা ইতিমধ্যে একটি আন্তর্জাতিক মানের।



1
@ এইডিন: আগস্ট 24 '10 এ 12:02
অবতীশ্চেভ

@ আইডিন: এবং হ্যাঁ, এটি একটি সদৃশ। বিন্যাসে একমাত্র পার্থক্য। বাকিগুলিও একই রকম।
abatishchev

6
@ বাতিশচেভ, এবং সে কারণেই এটি সদৃশ নয়। "সদৃশ" এর উত্তরটি 8601 হ্যান্ডেল করে না
স্পিরালিস

3
হ্যাঁ এটি কোনও সদৃশ নয়। এই প্রশ্নটি আইএসও 8601 ফর্ম্যাটটি পার্স করার জন্য নির্দিষ্ট।
জোস

উত্তর:


142

এই সমাধানটি ডেটটাইম স্টাইলস গণনার ব্যবহার করে এবং এটি জেড এর সাথেও কাজ করে।

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

এটি সমাধানটি পুরোপুরি মুদ্রণ করে।


3
সম্পাদিত সমাধানটি দুর্দান্তভাবে DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);কাজ করছে বলে মনে হচ্ছে।
j3ko

4
যে কেউ এই DateTimeStyles.RoundtripKind? এমএসডিএন বিবরণটি বিশদভাবে বলতে চান তা ফাঁকা
স্টিভ প্যারিশ

8
দেখে মনে হচ্ছে এই উত্তরটি আরও ভাল উত্তর প্রতিফলিত করার জন্য সম্পাদিত হয়েছিল তবে @ ম্যামটাড মূল উত্তরটি ওভাররোট করার কারণে মন্তব্যগুলি খুব বিভ্রান্তিকর হয়ে ওঠে। শুরুতে আমি নিশ্চিত ছিলাম না যে উপরের মন্তব্যের কারণে উত্তরটি ঠিক আছে তবে আমি বুঝতে পেরেছিলাম যে ভুল উত্তরটি সঠিক উত্তর দিয়ে প্রতিস্থাপন করা হয়েছিল
এডিন

5
ভগ্নাংশের অঙ্ক সহ আমার পক্ষে কাজ করে না। 2018-06-19T14:56:14.123Zস্থানীয় সময় হিসাবে পার্স করা হয়, ইউটিসি নয়। আমি CultureInfo.InvariantCultureনাল পরিবর্তে ব্যবহার ।
এরিক হার্ট

1
উপর আরও তথ্যের জন্য DateTimeStyles.RoundTripKind, stackoverflow.com/q/39572395/2014893 দেখুন
রবার্ট কে। বেল

33

যদিও এমএসডিএন বলে যে "এস" এবং "ও" ফর্ম্যাটগুলি মানটিকে প্রতিফলিত করে, তারা মনে হয় এটির কেবলমাত্র একটি সীমিত উপসেট পার্স করতে সক্ষম হবে। স্ট্রিংয়ে টাইম জোনের স্পেসিফিকেশন থাকলে বিশেষত এটি একটি সমস্যা। (এটি বেসিক 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 );
}

আপনি যদি টিজেড-কম স্ট্রিংগুলি পার্স করার আপত্তি না জানায় (আমি করি) তবে আপনি কভারেড ফর্ম্যাট পরিবর্তনের সংখ্যাটি প্রসারিত করতে "" s "লাইন যুক্ত করতে পারেন।


3
আমি যোগ হবে "yyyyMMdd"formatsদিন কমে নির্ভুলতার জন্য অ্যারে হিসাবে এই মাঝে মাঝে যদি একটি জন্য RFC 5545 RRULE একটি DTSTART উপর নির্ভর সময় প্রদান করবে।
কাইল ফ্যালকোনার

1
ব্যবহারের Kফলে আপনি আপনার বিভিন্ন টাইম-জোন হ্যান্ডলিংগুলি একসাথে রোল করতে পারবেন। আমি স্ট্যাকওভারফ্লো . com/ a/ 31246449/400547 এ আরও বিস্তৃত রূপ পেয়েছি তবে এটি যদি খুব বেশি বিস্তৃত হয় (আইএসও 8601 বৈধ যে জিনিসগুলি গ্রহণ করা হয় তবে আরও সাধারণ প্রোফাইলগুলিতে ব্যবহৃত হয় না) তবে এটি দেখায় যে কীভাবে Kআকারটি হ্রাস করতে পারে তৃতীয়।
জন হানা

20
using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

1
মিথ্যা এবং ডি produces> "1/1/0001 12:00:00 এএম" লিনকপ্যাডে উত্পাদন করে :(
রেব.কবিন

@ রিব: "2010-08-20T15: 00: 00" এবং "s", শেষের দিকে "জেড" না থাকলে
আবতিশচেভ

সংশোধন করা হয়েছে :) আমার সমস্ত নমুনায় জেড প্রদর্শিত হবে (যা বিভিন্ন জিপিএস ইউনিট এবং জিপিএক্স ফাইল থেকে আসে)
রেব.কবিন

অন্য একটি আইএসও 8601 রেফারেন্সে খুঁজে পাওয়া যায় যে "জেড" জোনাকে বোঝায় - যেমন সময় অঞ্চল হিসাবে।
রেব কেবিন

30
জেড আসলে জুলু সময় বা ইউটিসির জন্য বোঝায়। en.wikedia.org/wiki/ISO_8601#UTC
পিটার স্টিফেন্স

19

আমার জন্য এটি আরও ভাল কাজ করার একটি এখানে রয়েছে ( লাইনকপ্যাড সংস্করণ):

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()

উত্পাদন করে

true
8/20/2010 8:00:00 AM

বর্তমানে আমার ইউনিট পরীক্ষাগুলিতে যাচাই করার জন্য এটি ব্যবহার করছে যে তারিখগুলি আশা করি যে সমস্ত স্ট্রিং Iso8601 ফর্ম্যাটের। ধন্যবাদ!
anthv123

1
কেন এটি ইউটিসিতে নয় এমন টাইমস্ট্যাম্প দেয় ?! "অ্যাসিমেট ইউনিভার্সাল" এর সাথে "ইনভেরিয়েন্ট সংস্কৃতি" এর মূল নীতিমালার বেশিরভাগ লঙ্ঘন এটি করা উচিত নয় কারণ ডিএসটি বিশ্বজুড়ে এত বন্যভাবে পৃথক হয়, তাই আপনার স্থানীয় প্রচলিত টাইম জোনে ফিরে আসা যদি আপনি কোডটি চালানো শুরু করেন তবে বাগগুলি প্রবর্তন করতে পারে বিভিন্ন সেটিংস সহ একটি সার্ভারে!
এলাশকানোরে

7

TryParseExactকাজ করার জন্য আইএসও স্ট্রিংয়ের বিন্যাসটি হুবহু মিলে যাওয়া গুরুত্বপূর্ণ বলে মনে হচ্ছে। আমার ধারণা হুবহু হুবহু সঠিক এবং এই উত্তরটি বেশিরভাগ ক্ষেত্রে সুস্পষ্ট তবে যাইহোক ...

আমার ক্ষেত্রে, রেব.কবিনের উত্তরটি কাজ করে না কারণ আমার নীচে আমার "মান" অনুযায়ী কিছুটা আলাদা ইনপুট রয়েছে।

মান: 2012-08-10T14:00:00.000Z

মিলিসেকেন্ডের জন্য সেখানে আরও কয়েকটি 000 রয়েছে এবং আরও অনেক কিছু থাকতে পারে।

তবে আমি .fffনীচে প্রদর্শিত হিসাবে ফর্ম্যাট কিছু যোগ করা হলে, সব ঠিক আছে।

ফর্ম্যাট স্ট্রিং: @"yyyy-MM-dd\THH:mm:ss.fff\Z"

ভিএস 2010 তাত্ক্ষণিক উইন্ডোতে:

DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);

সত্য

DateTimeStyles.AssumeLocalআপনার সময়টি কোন অঞ্চলের জন্য তা নির্ভর করে আপনাকে পাশাপাশি ব্যবহার করতে হতে পারে ...


1
এটি আমার পক্ষে কাজ করেছিল, তবে আমাকেও পরিবর্তন AssumeUniversalকরতে হয়েছিল AdjustToUniversal
অগস্টো ব্যারেটো

4

এটি লিনকিপ্যাড ৪-তে দুর্দান্ত কাজ করে:

Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.