একটি স্ট্রিংকে ডেটটাইমে রূপান্তর করা হচ্ছে


589

আপনি কিভাবে যেমন একটি স্ট্রিং এ কনভার্ট করব 2009-05-08 14:40:52,531একটি মধ্যে DateTime?


2
@dban কেন একটি প্রতিক্রিয়া @CMSএকটি উত্তর হিসাবে চিহ্নিত করা হয়নি? আমি উত্সাহী একটি কারণ থাকতে পারে।
নাম

5
@ নাম ব্যবহারকারী তার অ্যাকাউন্ট মুছে ফেলেছে বা নিষিদ্ধ হয়ে গেছে, এটিতে ক্লিক করতে পারে না খ্যাতি / পদকগুলি দেখতে পারে না। দুঃখের বিষয় আমরা যা করতে পারি তা হ'ল তাকে কিছু থাম্ব আপ দেওয়া।
YumeYume

উত্তর:


753

যেহেতু আপনি 24 ঘন্টা ভিত্তিক সময় পরিচালনা করছেন এবং আপনার কাছে কমাটি সেকেন্ডের বিভাজন পৃথক করছে, তাই আমি আপনাকে একটি কাস্টম ফর্ম্যাট নির্দিষ্ট করার পরামর্শ দিচ্ছি:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
ভাল চোখ। আমি ওপিতে কমা দেখিনি।
এলসি

(আমি মনে করি আপনি ডেট এবং ফর্ম্যাট স্ট্রিংগুলিতে কমা ব্যবহার করতে চেয়েছিলেন, যদিও, ঠিক?)
এলসি।

1
ইউপি ইউরোপীয় লোকেল সেটিংয়ের কারণে এটি কেবলমাত্র কমা, যদি আপনি কোনও কোডটি কোনও মার্কিন যুক্তরাষ্ট্রে অন্য সার্ভারে নিয়ে যান, তবে কোনও বিভাগের ভগ্নাংশটি দশমিক দশমিক হবে যা সেভ স্ট্রিংয়ে কমা নয়, এবং আপনার সমাধান হবে বিরতি। সঠিক পার্সার প্রয়োগের আগে আপনি তার সঠিক লোকেলের জন্য আগত ডেটটাইম স্ট্রিংয়ের ধরণের জন্য একটি চেক যুক্ত করেছেন তা নিশ্চিত করুন। আমি বিস্মিত যে মাইক্রোসফট ইতিমধ্যে এই কোড prebuild অন্য কোথাও CLR অথবা C # এর .net নেই
হামিশ

এটি তারিখের সময়ের স্ট্রিং মাইস্ট্রিং = "06/22/1916 3:20:14 অপরাহ্ন" এ রূপান্তর করতে অক্ষম;
বিনোদ কুমার

দশমিক বিভাজক হিসাবে 24 ঘন্টা সময় এবং কমা কোনও কাস্টম লোকেল নয়। এটি বিশেষভাবে পরিচালনা করার দরকার নেই।
jpaugh

248

আপনার কাছে এটির জন্য মূলত দুটি বিকল্প রয়েছে। DateTime.Parse()এবং DateTime.ParseExact()

প্রথমটি সিনট্যাক্সের ক্ষেত্রে অত্যন্ত ক্ষমাশীল এবং বিভিন্ন ফরম্যাটে তারিখগুলি পার্স করবে। এটি ব্যবহারকারীর ইনপুটটির জন্য ভাল যা বিভিন্ন ফর্ম্যাটে আসতে পারে।

পার্সেক্স্যাক্ট আপনাকে পার্সিংয়ের জন্য আপনার তারিখের স্ট্রিংয়ের সঠিক বিন্যাসটি নির্দিষ্ট করতে দেয়। আপনার স্ট্রিং সর্বদা একই বিন্যাসে থাকলে এটি ব্যবহার করা ভাল। এইভাবে, আপনি সহজেই প্রত্যাশিত ডেটা থেকে কোনও বিচ্যুতি সনাক্ত করতে পারেন।

আপনি এর মতো ব্যবহারকারীর ইনপুট পার্স করতে পারেন:

DateTime enteredDate = DateTime.Parse(enteredString);

স্ট্রিংয়ের জন্য যদি আপনার নির্দিষ্ট বিন্যাস থাকে তবে আপনার অন্য পদ্ধতিটি ব্যবহার করা উচিত:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"সংক্ষিপ্ত তারিখের প্যাটার্নটির জন্য দাঁড়িয়েছে ( আরও তথ্যের জন্য এমএসডিএন দেখুন ) এবং nullসুনির্দিষ্টভাবে উল্লেখ করে যে বর্তমান সংস্কৃতিটি স্ট্রিং পার্স করার জন্য ব্যবহার করা উচিত।


136

এটা চেষ্টা কর

DateTime myDate = DateTime.Parse(dateString);

একটি ভাল উপায় এটি হবে:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}


26

কেউ বর্ধিতকরণের পদ্ধতি প্রয়োগ করেছে বলে মনে হয় না। সাহায্যে @, CMS এর উত্তর :

কাজ করা এবং উন্নত পূর্ণ উত্স উদাহরণ এখানে: গিস্ট লিঙ্ক

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}

Nobody seems to implemented an extension methodসম্ভবত কারণ প্রয়োজন নেই ...
ইউশা আলেয়ুব

কখনও কখনও স্ট্যান্ডার্ড লাইব্রেরি আমাদের প্রয়োজনের সাথে খাপ খায় না। এবং এজন্য প্রয়োজন সাহায্যকারী লাইব্রেরিগুলি / প্রয়োজন। এক্সটেনশন পদ্ধতির উপায়টি ব্যবহার করে, বা সাবলীল এপিআই OO এর থেকে বিপরীতে এফপি পছন্দ করে। সঠিক বা ভুলও নয়। এটা পছন্দ। @ ইউশাআলয়্যুব
গুনিসাস

23

আমি বিভিন্নভাবে চেষ্টা করেছি। আমার জন্য যা কাজ করেছিল তা হ'ল:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data আমার জন্য এই সময় ছিল 9/24/2017 9:31:34 এএম


আরও ভাল দেখাচ্ছে, ডেটটাইম ভেরিয়েবল এর মান নির্ধারণ করতে পারে?
বিরহান নেগা

20

নীচে চেষ্টা করুন, যেখানে স্ট্রিমেটটি 'এমএম / ডিডি / ইয়ে' ফর্ম্যাটে আপনার তারিখ

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
কেউ উল্লেখ করেনি যে এটি কেবলমাত্র সেই নির্দিষ্ট বিন্যাসের সাথেই কাজ করে।
টুডো

করুণা ... 🙂 কোডাররা সবসময় ভাবেন সহকর্মী কোডারগুলি বের করে আনবে ... আসলে ভাল জিনিস ... আমাদের আরও চিন্তা করতে দিন ...
কৃষ্ণ


15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

1
আপনি সময়ের অংশ মিস করেছেন? আমার তারিখ এবং সময় উভয়ই দরকার, আমি কীভাবে এটি করতে পারি?
বাদোন জৈন

15

DateTime.Parse

বাক্য গঠন:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

উদাহরণ:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • মান: তারিখ এবং সময়ের স্ট্রিং প্রতিনিধিত্ব।
  • সরবরাহকারী: বস্তু যা সংস্কৃতি নির্দিষ্ট তথ্য সরবরাহ করে।
  • স্টাইলস: ফর্ম্যাটিং বিকল্পগুলি যা কিছু তারিখ এবং সময় পার্সিং পদ্ধতির জন্য স্ট্রিং পার্সিংকে কাস্টমাইজ করে। উদাহরণস্বরূপ, AllowWhiteSpaces এমন একটি মান যা পার্স করার সময় স্ট্রিংয়ে উপস্থিত সমস্ত স্থানকে অগ্রাহ্য করতে সহায়তা করে।

এটা মনে রাখার মতোও যে ডেটটাইম এমন একটি অবজেক্ট যা ফ্রেমওয়ার্কে অভ্যন্তরীণভাবে নম্বর হিসাবে সঞ্চিত থাকে, ফর্ম্যাট কেবল তখনই প্রয়োগ হয় যখন আপনি এটিকে স্ট্রিংয়ে ফিরে রূপান্তর করেন convert

  • একটি স্ট্রিংকে অভ্যন্তরীণ সংখ্যা প্রকারে রূপান্তর করে।

  • অভ্যন্তরীণ সংখ্যাসূচক মানটিকে পাঠযোগ্য স্ট্রিংয়ে রূপান্তরকরণ ফর্ম্যাট করা।

আমার সম্প্রতি একটি সমস্যা হয়েছিল যেখানে আমি লিনকে পাস করার জন্য ডেটটাইমকে রূপান্তর করার চেষ্টা করছিলাম যা আমি তখন বুঝতে পারি নি যে ফর্ম্যাটটি ছিল লিনাকের ক্যোয়ারিতে ডেটটাইম পাস করার সময় অপ্রাসঙ্গিক।

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

সম্পূর্ণ তারিখটাইম ডকুমেন্টেশন


14

আপনি যদি ইনপুট মান সম্পর্কে অনিশ্চিত থাকেন তবে আপনি নীচে ডেটটাইম.ট্রি পার্সি এক্স্যাক্ট () ব্যবহার করতে পারেন।

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}

2

একটি স্ট্যাটিক শ্রেণিতে এই কোডটি রাখুন> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

এইভাবে, আপনি ব্যবহার করতে পারেন

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

2

আমি সবেমাত্র একটি মার্জিত উপায় পেয়েছি:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

1

বিশ্বের বিভিন্ন সংস্কৃতি বিভিন্ন উপায়ে তারিখের স্ট্রিং লিখেছে। উদাহরণস্বরূপ, মার্কিন যুক্তরাষ্ট্রে 01/20/2008 20 শে জানুয়ারী, ২০০৮ France কারণ ফ্রান্স দিন / মাস / বছর হিসাবে তারিখের বার পড়ে এবং মার্কিন যুক্তরাষ্ট্রে এটি মাস / দিন / বছর হয়।

ফলস্বরূপ, 20/01/2008 এর মতো একটি স্ট্রিং ফ্রান্সে 20 শে জানুয়ারী, 2008 এ বিশ্লেষণ করবে এবং তারপরে মার্কিন যুক্তরাষ্ট্রে একটি অবৈধ ফর্ম্যাট এক্সেকশনটি ছুঁড়ে দেবে।

আপনার বর্তমান সংস্কৃতি সেটিংস নির্ধারণ করতে আপনি সিস্টেম.গ্লোবালাইজেশন.ক্ল্যাচারআইনফোর.কন্টেনচারালচার ব্যবহার করতে পারেন।

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  


-1

আপনি এটি দ্রুত চান?

ধরা যাক yyMMdd ফর্ম্যাট সহ আপনার একটি তারিখ রয়েছে।

আমি এটির রূপান্তর করার দ্রুততম উপায় হ'ল:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

কেবলমাত্র আপনার পছন্দসই তারিখের ফর্ম্যাট অনুসারে সূচিগুলি চয়ন করুন। আপনার যদি গতির প্রয়োজন হয় তবে সম্ভবত আপনি ফাংশনের 'অ-জেনেরিক' উপায়টিকে আপত্তি করবেন না।

এই পদ্ধতিটি দ্বারা প্রয়োজনীয় সময়ের প্রায় 10% সময় নেয়:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.