সি # তে ডেটটাইমকে স্ট্রিং পার্স করুন


165

স্ট্রিংটিতে আমার মতো তারিখ এবং সময় রয়েছে তার মতো:

"2011-03-21 13:26" //year-month-day hour:minute

আমি কীভাবে এটি পার্স করতে পারি System.DateTime?

আমি মত ফাংশন ব্যবহার করতে চান DateTime.Parse()DateTime.ParseExact()তারিখের ফর্ম্যাটটি ম্যানুয়ালি নির্দিষ্ট করতে সক্ষম হতে বা সম্ভব হলে ।


19
তাহলে আপনি ডেটটাইম.পার্স ব্যবহার করবেন না কেন?
অস্টিন সালোনেন

8
আমি ডাউন ডাউনদের মধ্যে একজন ছিলাম। কারণ আপনার আসল প্রশ্ন ( স্ট্যাকওভারফ্লো.com / রিভিশনস /… ) জানিয়েছিল যে আপনি ডেটটাইম. পার্স () ব্যবহার করতে চেয়েছিলেন তবে আপনি কেন এটি ব্যবহার করতে পারবেন না তা উল্লেখ করেননি। এটি এটিকে একটি অযৌক্তিক প্রশ্নের মতো মনে হয়েছে, বিশেষত যেহেতু একটি সাধারণ চেক এটি পরিষ্কার করে দিয়েছে যে কাকোয়াস সঠিক ছিল: আপনার স্ট্রিং "2011-03-21 13:26" ডেটটাইম-এর জন্য সমস্যা নয় is পার্স ()। অবশেষে, আপনি আপনার আসল প্রশ্নে পার্সেক্সট্যাক্ট () এর কোনও উল্লেখ করেননি। আপনি কোনও সম্পাদনায় এটি যুক্ত করার জন্য মিচের উত্তরের পরে অপেক্ষা করেছিলেন ।
আনন

4
আমি মন্তব্যগুলিতে কোনও কারণ না দিয়ে কেবল এই লোকগুলিকে ভোট দেওয়ার প্রশ্নে ভালবাসি।
হুচ

উত্তর:


271

DateTime.Parse()প্রদত্ত তারিখের ফর্ম্যাটটি বের করার চেষ্টা করবে এবং এটি সাধারণত একটি ভাল কাজ করে। আপনি যদি গ্যারান্টি দিতে পারেন তবে তারিখগুলি সর্বদা প্রদত্ত বিন্যাসে থাকবে তবে আপনি ব্যবহার করতে পারেন ParseExact():

string s = "2011-03-21 13:26";

DateTime dt = 
    DateTime.ParseExact(s, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);

(তবে মনে রাখবেন যে কোনও তারিখ প্রত্যাশিত ফর্ম্যাটে না থাকলে ট্রাই পার্সে পদ্ধতিগুলির মধ্যে একটি ব্যবহার করা সাধারণত নিরাপদ))

কাস্টম তারিখ এবং সময় ফর্ম্যাট স্ট্রিংগুলি পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত করুন করে দেখুন, বিশেষত বর্ণগুলি এবং কেসের সংখ্যায় (যেমন "এমএম" এবং "মিমি" মানে খুব আলাদা জিনিস) তে মনোযোগ দিন।

C # এর বিন্যাস স্ট্রিং জন্য আরেকটি দরকারী সম্পদ C # স্ট্রিং বিন্যাস


5
সংশোধন - এটি সর্বদাই নিরাপদ;) আপনি যদি কোনও ব্যতিক্রম ব্যতীত কোনও পদ্ধতি কল করে থাকেন, তবে সম্ভব হলে সর্বদা প্রথমে ব্যতিক্রম শর্তটি পরীক্ষা করুন।
গুড্ডর

3
আমি বলতে পারি যে আপনার সংস্কৃতি সর্বদা পাস করা নিরাপদ। "01-02-2013" "জানুয়ারীর দ্বিতীয় বা ফেব্রুয়ারীর প্রথম হিসাবে ভুল ব্যাখ্যা করা ছাড়া আমার একটি ব্যতিক্রম থাকত।
কারা

1
@ কারা: আইএসও ৮60০১ ফর্ম্যাটে তারিখগুলি (যেমন ইয়াই-মিমি-ডিডি 'সর্বদা সঠিক উপায়ে ব্যাখ্যা করা হয় That তাই আমরা ISO8601 ফর্ম্যাটের তারিখগুলি ব্যবহার করি ...
মিচ গম

পার্স হুবহু দরকারী হতে পারে। কখনও কখনও, আমি ভুল আউটপুট উত্পাদন করার বিপরীতে আমার অ্যাপ্লিকেশন ক্র্যাশ এবং কম্পিউটারের আগুন জ্বলতে পছন্দ করব। আবেদনের উপর নির্ভর করে।
অ্যালেন

পার্সেক্স্যাক্ট দুর্দান্ত কারণ এটি নমনীয়, তবে এর একটি নেতিবাচক দিক রয়েছে: নোট করুন যে ভেরিয়েবলের তারিখের বিন্যাসে সিনট্যাক্স ত্রুটি থাকলে পার্সেক্স্যাক্ট এবং পার্স পদ্ধতিগুলি ব্যতিক্রম ছুঁড়ে ফেলে s। তাই ট্রাইপার্সি এক্স্যাক্ট ব্যবহার করা ভাল আমি নীচে আমার উত্তরে কেন উল্লেখ করেছি।
ম্যাট

47

আমি যেমন পরে ব্যাখ্যা করছি, আমি সর্বদা পদ্ধতি TryParseএবং TryParseExactপদ্ধতির পক্ষে চাই । এগুলি ব্যবহার করতে কিছুটা ভারী হওয়ায় আমি একটি এক্সটেনশন পদ্ধতি লিখেছি যা পার্সিংকে আরও সহজ করে তোলে:

var    dtStr = "2011-03-21 13:26";
DateTime? dt = dtStr.ToDate("yyyy-MM-dd HH:mm");

ইত্যাদি থেকে পৃথক Parse, ParseExactএটি একটি ব্যতিক্রম ছুঁড়ে না, এবং আপনাকে মাধ্যমে পরীক্ষা করতে দেয় allows

if (dt.HasValue) { // continue processing } else { // do error handling }

রূপান্তরটি সফল হয়েছিল কিনা (এই ক্ষেত্রে dtআপনার মাধ্যমে অ্যাক্সেস করতে পারেন এমন একটি মান রয়েছে dt.Value) বা না (এই ক্ষেত্রে এটি হ'ল null)।

এটি এমনকি "এলভিস" -অ্যাপেরেটরের মতো মার্জিত শর্টকাটগুলি ব্যবহার করার অনুমতি দেয় ?.:

int? year = dtStr?.ToDate("yyyy-MM-dd HH:mm")?.Year;

year.HasValueরূপান্তরটি সফল হয়েছে কিনা তা পরীক্ষা করতে আপনি এখানেও ব্যবহার করতে পারেন এবং এটি যদি সফল না হয় তবে তা yearথাকবে null, অন্যথায় তারিখের বছরের অংশটি। রূপান্তর ব্যর্থ হলে সেখানে কোনও ব্যতিক্রম ছোঁড়া হয় না।


সমাধান:   .ToDate () এক্সটেনশন পদ্ধতি

। নেটফিডেলে এটি চেষ্টা করুন

public static class Extensions
{
    // Extension method parsing a date string to a DateTime?
    // dateFmt is optional and allows to pass a parsing pattern array
    // or one or more patterns passed as string parameters
    public static DateTime? ToDate(this string dateTimeStr, params string[] dateFmt)
    {
      // example: var dt = "2011-03-21 13:26".ToDate(new string[]{"yyyy-MM-dd HH:mm", 
      //                                                  "M/d/yyyy h:mm:ss tt"});
      // or simpler: 
      // var dt = "2011-03-21 13:26".ToDate("yyyy-MM-dd HH:mm", "M/d/yyyy h:mm:ss tt");
      const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces;
      if (dateFmt == null)
      {
        var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat;
        dateFmt=dateInfo.GetAllDateTimePatterns();
      }
      // Commented out below because it can be done shorter as shown below.
      // For older C# versions (older than C#7) you need it like that:
      // DateTime? result = null;
      // DateTime dt;
      // if (DateTime.TryParseExact(dateTimeStr, dateFmt,
      //    CultureInfo.InvariantCulture, style, out dt)) result = dt;
      // In C#7 and above, we can simply write:
      var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture,
                   style, out var dt) ? dt : null as DateTime?;
      return result;
    }
}

কোড সম্পর্কে কিছু তথ্য

আপনি ভাবতে পারেন, কেন আমি InvariantCultureকলিং ব্যবহার করেছি TryParseExact: এটি ফাংশনটিকে সর্বদা একইভাবে বিন্যাসের আচরণ করতে বাধ্য করা হয় (অন্যথায় উদাহরণস্বরূপ "।" এটি যখন গ্রুপ বিভাজক হয় তখন ইংরেজিতে দশমিক বিভাজক হিসাবে ব্যাখ্যা করা যেতে পারে বা তারিখ বিভাজক হয় জার্মান)। প্রত্যাহার করুন আমরা সংস্কৃতি ভিত্তিক ফর্ম্যাট স্ট্রিংগুলি কয়েক লাইনের আগে জিজ্ঞাসা করেছি যাতে এটি ঠিক আছে।

আপডেট: .ToDate() (প্যারামিটার ব্যতীত) এখন থ্রেডের বর্তমান সংস্কৃতির সমস্ত সাধারণ তারিখ / সময় নিদর্শনগুলিতে ডিফল্ট।
নোট করুন যে আমাদের প্রয়োজন resultএবং dtএকসাথে দরকার , কারণ TryParseExactব্যবহার করার অনুমতি দেয় না DateTime?, যা আমরা ফেরত যেতে চাইছি। ইন সি # সংস্করণ 7 আপনি প্রক্রিয়া সহজ পারে ToDateনিম্নরূপ ফাংশন একটি বিট:

 // in C#7 only: "DateTime dt;" - no longer required, declare implicitly
 if (DateTime.TryParseExact(dateTimeStr, dateFmt,
     CultureInfo.InvariantCulture, style, out var dt)) result = dt;

অথবা, আপনি যদি এটি আরও ছোট করে পছন্দ করেন:

 // in C#7 only: Declaration of result as a "one-liner" ;-)
 var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture,
              style, out var dt) ? dt : null as DateTime?;

যে ক্ষেত্রে আপনার দুটি ঘোষণাপত্রের DateTime? result = null;এবং কোনও প্রয়োজন নেই DateTime dt;- আপনি কোডের এক লাইনে এটি করতে পারেন। ( আপনি যদি এটি পছন্দ করেন তবে out DateTime dtপরিবর্তে এটি লেখারও অনুমতি দেওয়া হবে out var dt)।

আমি paramsকীওয়ার্ডটি ব্যবহার করে কোডটি আরও সরল করে দিয়েছি : এখন আপনার আর 2 এনডি ওভারলোডেড পদ্ধতি দরকার নেই ।


ব্যবহারের উদাহরণ

var dtStr="2011-03-21 13:26";    
var dt=dtStr.ToDate("yyyy-MM-dd HH:mm");
if (dt.HasValue)
{
    Console.WriteLine("Successful!");
    // ... dt.Value now contains the converted DateTime ...
}
else
{
    Console.WriteLine("Invalid date format!");
}

আপনি দেখতে পাচ্ছেন, এই উদাহরণটি dt.HasValueরূপান্তরটি সফল হয়েছে কি না তা দেখার জন্য কেবল অনুসন্ধান করে। অতিরিক্ত বোনাস হিসাবে, ট্রাইপার্সি এক্স্যাক্ট কঠোরভাবে নির্দিষ্ট করতে দেয় DateTimeStylesযাতে আপনি সঠিক তারিখ / সময় স্ট্রিং পেরিয়ে গেছে কিনা তা ঠিক জানেন know


ব্যবহারের আরও উদাহরণ

ওভারলোডেড ফাংশন আপনাকে এখানে যেমন দেখানো হয়েছে ( সরাসরি এটি সমর্থন করে) যেমন পার্সিং / রূপান্তর করার জন্য ব্যবহৃত বৈধ বিন্যাসগুলির একটি অ্যারে পাস করার অনুমতি দেয় , যেমনTryParseExact

string[] dateFmt = {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                     "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                     "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                     "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                     "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
var dtStr="5/1/2009 6:32 PM"; 
var dt=dtStr.ToDate(dateFmt);

আপনার যদি কয়েকটি কয়েকটি টেম্পলেট নিদর্শন থাকে তবে আপনি এটিও লিখতে পারেন:

var dateStr = "2011-03-21 13:26";
var dt = dateStr.ToDate("yyyy-MM-dd HH:mm", "M/d/yyyy h:mm:ss tt");

উন্নত উদাহরণ

আপনি ??ব্যর্থ-নিরাপদ বিন্যাসে ডিফল্ট করতে অপারেটরটি ব্যবহার করতে পারেন , যেমন

var dtStr = "2017-12-30 11:37:00";
var dt = (dtStr.ToDate()) ?? dtStr.ToDate("yyyy-MM-dd HH:mm:ss");

এই ক্ষেত্রে, এটি .ToDate()সাধারণ স্থানীয় সংস্কৃতি তারিখের ফর্ম্যাটগুলি ব্যবহার করবে এবং যদি এই সমস্ত ব্যর্থ হয়, তবে এটি আইএসও স্ট্যান্ডার্ড ফর্ম্যাটটিকে "yyyy-MM-dd HH:mm:ss"ফ্যালব্যাক হিসাবে ব্যবহার করার চেষ্টা করবে । এইভাবে, এক্সটেনশন ফাংশনটি সহজেই বিভিন্ন ফ্যালব্যাক ফর্ম্যাটগুলিকে "চেইন" করতে দেয়।

এমনকি আপনি লিনকিউতে এক্সটেনশনটি ব্যবহার করতে পারেন, এটি ব্যবহার করে দেখুন (এটি উপরের নেটফিডেলে রয়েছে):

var patterns=new[] { "dd-MM-yyyy", "dd.MM.yyyy" };
(new[] { "15-01-2019", "15.01.2019" }).Select(s => s.ToDate(patterns)).Dump(); 

যা নমুনাগুলি ব্যবহার করে ফ্লাইটে অ্যারেতে তারিখগুলি রূপান্তর করবে এবং কনসোলে ডাম্প করবে।


ট্রাইপার্সেক্স্যাক্ট সম্পর্কে কিছু পটভূমি

শেষ অবধি, ব্যাকগ্রাউন্ড সম্পর্কে কিছু মন্তব্য এখানে দেওয়া হয়েছে (উদাহরণস্বরূপ যে কারণে আমি এটি এভাবে লিখেছি):

আমি এই এক্সটেনশন পদ্ধতিতে ট্রাই পার্সেক্স্যাক্টকে প্রাধান্য দিচ্ছি , কারণ আপনি ব্যতিক্রম হ্যান্ডলিং এড়ান - আপনি পার্সের পরিবর্তে ট্রাইপার্স কেন ব্যবহার করবেন সে ব্যতিক্রম সম্পর্কে আপনি এরিক লিপার্টের নিবন্ধে পড়তে পারেন , আমি তাকে এই বিষয়টির উদ্ধৃতি দিয়েছি: 2)

এই দুর্ভাগ্যজনক ডিজাইনের সিদ্ধান্ত 1) [টিকা: পার্স পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়তে দিন] এতটাই উদ্বেগজনক ছিল যে অবশ্যই ফ্রেমওয়ার্কস দলটি ট্রাইপার্সাকে কার্যকর করেছিল এর পরেই যা সঠিক কাজ করে does

এটা আছে, কিন্তু TryParseএবং TryParseExactউভয় এখনো অনেক কম ব্যবহার আরামদায়ক আছেন: তারা একটি হিসাবে একটি uninitialized ভেরিয়েবল ব্যবহার করার জন্য আপনি বাধ্য outপরামিতি, যা nullable হবে না এবং আপনি রূপান্তর করছি যখন আপনি বুলিয়ান ফেরত মান নির্ণয় করা প্রয়োজন - পারেন আপনি ifঅবিলম্বে একটি বিবৃতি ব্যবহার করতে বা আপনাকে অতিরিক্ত বুলিয়ান ভেরিয়েবলে রিটার্ন মান সংরক্ষণ করতে হবে যাতে আপনি পরে চেকটি করতে সক্ষম হবেন able এবং আপনি রূপান্তরটি সফল হয়েছে কিনা তা জেনেও কেবল টার্গেট ভেরিয়েবলটি ব্যবহার করতে পারবেন না।

বেশিরভাগ ক্ষেত্রে আপনি কেবল জানতে চান যে রূপান্তরটি সফল হয়েছিল কিনা (এবং অবশ্যই এটি সফল হলে মানটি) , তাই একটি অযোগ্য লক্ষ্য পরিবর্তনশীল যা সমস্ত তথ্য রাখে তা আকাঙ্ক্ষিত এবং আরও মার্জিত হবে - কারণ পুরো তথ্যটি হ'ল কেবলমাত্র এক জায়গায় সংরক্ষণ করা হয়েছে: এটি ধারাবাহিক এবং সহজেই ব্যবহারযোগ্য এবং ত্রুটি-প্রবণতাও কম।

আমি যে এক্সটেনশন পদ্ধতিটি লিখেছি তা হুবহু এটি করে (এটি আপনাকে দেখায় যে আপনি প্রতিবার কী ধরণের কোড লিখতে হবে যদি আপনি এটি ব্যবহার না করে থাকেন)।

আমি বিশ্বাস করি এর সুবিধাটি .ToDate(strDateFormat)হ'ল এটি সহজ এবং পরিষ্কার দেখায় - মূলটি যতটা সহজ DateTime.Parseবলে মনে করা হত - তবে রূপান্তরটি সফল হয়েছিল কিনা তা পরীক্ষা করার ক্ষমতা সহ এবং ব্যতিক্রম ছুঁড়ে না ফেলে।


1) এখানে বোঝানো হচ্ছে ব্যতিক্রম হ্যান্ডলিং (অর্থাত্ একটি try { ... } catch(Exception ex) { ...}ব্লক) - যা আপনি যখন পার্স ব্যবহার করছেন তখন প্রয়োজনীয় কারণ এটি যদি কোনও অবৈধ স্ট্রিংকে বিশ্লেষণ করে তবে ব্যতিক্রম হয় - কেবল এই ক্ষেত্রে অপ্রয়োজনীয় নয় তবে বিরক্তিকর, এবং আপনার কোড জটিল। আমার দেওয়া কোডের নমুনাটি প্রদর্শিত হচ্ছে বলে ট্রিপ পার্সে এগুলি এড়িয়ে চলে।


২) এরিক লিপার্ট স্ট্যাকওভারফ্লো একজন বিখ্যাত সহকর্মী এবং মাইক্রোসফ্টে সি # সংকলক টিমের প্রধান বিকাশকারী হিসাবে কয়েক বছর ধরে কাজ করছিলেন।


13
var dateStr = @"2011-03-21 13:26";
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm", CultureInfo.CurrentCulture);

অন্যান্য ফর্ম্যাট স্ট্রিংয়ের জন্য এই লিঙ্কটি দেখুন !


5

তারিখটাইম.পার্স () স্ট্রিং ফর্ম্যাটের জন্য ভাল কাজ করা উচিত। রেফারেন্স:

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240

এটি কি আপনার জন্য ফর্ম্যাট এক্সেকশন নিক্ষেপ করছে?


4

একটি মানব-পঠনযোগ্য স্ট্রিংয়ের মান একটি। নেট ডেটটাইমে এই জাতীয় কোড সহ রাখুন:

DateTime.ParseExact("April 16, 2011 4:27 pm", "MMMM d, yyyy h:mm tt", null);

2

সহজ এবং সরল উত্তর ->

using System;

namespace DemoApp.App

{
public class TestClassDate
{
    public static DateTime GetDate(string string_date)
    {
        DateTime dateValue;
        if (DateTime.TryParse(string_date, out dateValue))
            Console.WriteLine("Converted '{0}' to {1}.", string_date, dateValue);
        else
            Console.WriteLine("Unable to convert '{0}' to a date.", string_date);
        return dateValue;
    }
    public static void Main()
    {
        string inString = "05/01/2009 06:32:00";
        GetDate(inString);
    }
}
}

/**
 * Output:
 * Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM.
 * */

সুন্দর @ শিবাম ভরদ্বাজ, আমি এটি একইভাবে করেছি
মুহাম্মদ ইরফান

2

আপনি এক্সএমএল কনভার্ট.টোডেটস্ট্রিংও ব্যবহার করতে পারেন

var dateStr = "2011-03-21 13:26";
var parsedDate = XmlConvert.ToDateTime(dateStr, "yyyy-MM-dd hh:mm");

তারিখের ধরণটি উল্লেখ করা ভাল, কোডটি হ'ল:

var anotherParsedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

বিভিন্ন পার্সিং বিকল্পে অধিক বিবরণের http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html


0

নিম্নলিখিত কোড ব্যবহার করে দেখুন

Month = Date = DateTime.Now.Month.ToString();   
Year = DateTime.Now.Year.ToString(); 
ViewBag.Today = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(Int32.Parse(Month)) + Year;

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