.NET তারিখের সময় থেকে কীভাবে মিলিসেকেন্ড ছাঁটাই করা যায়


333

আমি একটি ইনকামিং অনুরোধ থেকে একটি ডাটাবেস সঞ্চিত মান থেকে একটি সময় স্ট্যাম্প তুলনা করার চেষ্টা করছি। এসকিউএল সার্ভার অবশ্যই মিলি সেকেন্ডের সময়টিতে কিছুটা নির্ভুলতা রাখে এবং একটি। নেট ডেটটাইমে পড়ার সময়, এটি মিলিসেকেন্ডগুলি অন্তর্ভুক্ত করে। সিস্টেমে আগত অনুরোধটি অবশ্য সেই যথার্থতা সরবরাহ করে না, সুতরাং আমার খালি মিলি সেকেন্ড ছেড়ে যেতে হবে।

আমার মনে হচ্ছে আমি স্পষ্ট কিছু মিস করছি, তবে এটি করার জন্য আমি একটি মার্জিত উপায় খুঁজে পাইনি (সি #)।


(তৃতীয় চেষ্টা ...) যেহেতু 20% উত্তর ( 1 , 2 , 3 ) কীভাবে মিলিসেকেন্ড উপাদানটিকে বাদ দিয়ে বা অপসারণ করতে পারে তা একটির ফর্ম্যাট stringউপস্থাপনা থেকে বর্ণনা করে DateTime, সম্ভবত এটি সম্পাদন করা দরকার যে এটি "কাটা" / "ড্রপ" মিলিসেকেন্ডের অর্থ "এমন একটি DateTimeমান উত্পাদন করা যেখানে সমস্ত তারিখ / সময় উপাদানগুলি বাদে সমস্ত TimeOfDay.TotalMillisecondsহয় 0" " মানুষ অবশ্যই পড়েন না, তবে কেবল কোনও অস্পষ্টতা দূর করতে।
বেকন

উত্তর:


555

নিম্নলিখিতটি একটি ডেটটাইমটির জন্য কাজ করবে যার ভগ্নাংশ মিলিসেকেন্ড রয়েছে এবং এটি বিভিন্ন ধরণের সম্পত্তি (স্থানীয়, ইউটিসি বা অপরিজ্ঞাত) সংরক্ষণ করে।

DateTime dateTime = ... anything ...
dateTime = new DateTime(
    dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), 
    dateTime.Kind
    );

বা সমতুল্য এবং খাটো:

dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));

এটি একটি এক্সটেনশন পদ্ধতিতে সাধারণীকরণ করা যেতে পারে:

public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
    if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
    if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
    return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}

যা নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
...

আমি আপনাকে এটি দেবো কারণ আপনি প্রযুক্তিগতভাবে সঠিক, কারণ লোকেরা এসকিউএল সার্ভার থেকে ডেটা পাঠ করে কিছু বিতরণ করা ডেটার (আমার ক্ষেত্রে একটি ওয়েব-ভিত্তিক অনুরোধ) এর সাথে তুলনা করার জন্য, এই পরিমাণ সমাধানের প্রয়োজন নেই necessary
জেফ পুটজ

1
খুশী হলাম। স্পষ্টতই কারও কাছে ডেটটাইম ক্লাসকে কিছু বাড়ানোর পদ্ধতি নিকটতম যেদিকেই দেওয়া উচিত যাতে এই ধরণের ভাল কোডিং পুনরায় ব্যবহার হতে পারে।
chris.w.mclean

এটি খুব অসম্ভব, তবে টিক্স = 0 হলে এই পদ্ধতিটি ভেঙে যায় না?
এডিটআউট

@ অ্যাডআউট, উপরের ট্র্যাঙ্কেট পদ্ধতিটি ডিভাইডবিজারো এক্সেকশনটি নিক্ষেপ করবে যদি টাইমস্প্যান প্যারামিটারটি শূন্য হয়, আপনি কি "টিক্স = 0" যখন বিরতি ব্যবহার করবেন? টাইমস্প্যান শূন্য হলে আর্গুমেন্ট এক্সেকশনটি ফেলে দেওয়া ভাল।
জো

145
var date = DateTime.Now;

date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);

34
পরিষ্কার এবং সহজ, আপনি কোনও গুরুত্বপূর্ণ টুকরো তথ্য হারাবেন না তা নিশ্চিত করার জন্য কেবল নির্মাণকারীর শেষের দিকে ", তারিখ.কাইন্ড" যুক্ত করতে ভুলবেন না।
জেএমসিডানিয়েল

9
পারফরমেন্স সংবেদনশীল কোডে এই সমাধান সম্পর্কে সতর্ক হন। আমার অ্যাপ্লিকেশনটি সিটিইউর 12% সময় সিস্টেম.ডেটটাইম.গেটডেটপার্টে ব্যয় করছিল ।
কর্নেল আতঙ্ক

3
এটি সহজ, তবে সেরা উত্তর হিসাবে চিহ্নিত প্রশ্নের চেয়ে ধীর। এটি কোনও বাধা হতে পারে না তবে এটি প্রায় 7-8x ধীর।
জোনাস

"অনেক ধীর" বিবৃতিগুলি সঠিকভাবে সঠিক নয়, পার্থক্যটি রানটাইমের উপর নির্ভর করে 50% এবং প্রায় 100% এর মধ্যে রয়েছে; নেট 4.7.2: 0.35µs বনাম 0.62 and এস এবং কোর 3.1: 0.18 vs এস বনাম 0.12 that's সেগুলি যে মাইক্রো সেকেন্ড (10 ^ -6 সেকেন্ড)
জুন

61

পূর্ববর্তী উত্তরের উপর ভিত্তি করে এখানে একটি এক্সটেনশন পদ্ধতি যা আপনাকে যে কোনও রেজোলিউশনে ছাড়িয়ে দেবে ...

ব্যবহার:

DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)

ক্লাস:

public static class DateTimeUtils
{
    /// <summary>
    /// <para>Truncates a DateTime to a specified resolution.</para>
    /// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
    /// </summary>
    /// <param name="date">The DateTime object to truncate</param>
    /// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
    /// <returns>Truncated DateTime</returns>
    public static DateTime Truncate(this DateTime date, long resolution)
    {
        return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
    }
}

1
এটি একটি সত্যই নমনীয় এবং পুনরায় ব্যবহারযোগ্য সমাধান, এটি অত্যধিক শব্দভাবাপন্ন না হয়ে সংক্ষিপ্ত এবং অভিব্যক্তিক। আমার ভোট সেরা সমাধান হিসাবে।
জানস

2
আপনার আসলে% অপারেন্ডগুলির আশেপাশে প্রথম বন্ধনীগুলির দরকার নেই।
এরিক

8
.. তবে প্যারেনরা আমার মতে স্পষ্টতা যুক্ত করে।
ওরিওন এলিজিল

28
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);

70
-১: ডেটটাইম মানটিতে মিলিসেকেন্ডের ভগ্নাংশ অন্তর্ভুক্ত না হলে কেবলমাত্র কাজ করবে।
জো

7
এই পদ্ধতিটি ব্যবহারের ফলে আমার কিছু ইউনিট পরীক্ষা ব্যর্থ হতে পারে: প্রত্যাশিত: 2010-05-05 15: 55: 49.000 তবে ছিল: 2010-05-05 15: 55: 49.000। আমি জো মিলি সেকেন্ডের ভগ্নাংশ সম্পর্কে যা উল্লেখ করেছি তার কারণে অনুমান করছি।
শেঠ রেনো

6
সিরিয়ালাইজেশনের জন্য কাজ করে না, যেমন 2010-12-08T11: 20: 03.000099 + 15: 00 আউটপুট, মিলিসেকেন্ডগুলি পুরোপুরি কাটা যায় না।
0-10 এ joedotnot

5
Millisecondসম্পত্তি একটি দেয় পূর্ণসংখ্যা 0 এবং 999 (সহ) মধ্যে। সুতরাং যদি অপারেশনের আগের দিনের সময়টি ছিল, বলুন 23:48:49.1234567, তাহলে সেই পূর্ণসংখ্যাটি হবে 123এবং অপারেশন পরবর্তী দিনের সময় হবে 23:48:49.0004567। সুতরাং এটি পুরো সংখ্যায় সেকেন্ডে কাটেনি।
জেপ্পে স্টিগ নীলসেন

11

কখনও কখনও আপনি বছর বা মাসের মতো ক্যালেন্ডার-ভিত্তিক কিছুতে ছাঁটাই করতে চান। এখানে একটি এক্সটেনশন পদ্ধতি যা আপনাকে যে কোনও রেজোলিউশন চয়ন করতে দেয়।

public enum DateTimeResolution
{
    Year, Month, Day, Hour, Minute, Second, Millisecond, Tick
}

public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second)
{
    switch (resolution)
    {
        case DateTimeResolution.Year:
            return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind);
        case DateTimeResolution.Month:
            return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind);
        case DateTimeResolution.Day:
            return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind);
        case DateTimeResolution.Hour:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour));
        case DateTimeResolution.Minute:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute));
        case DateTimeResolution.Second:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond));
        case DateTimeResolution.Millisecond:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond));
        case DateTimeResolution.Tick:
            return self.AddTicks(0);
        default:
            throw new ArgumentException("unrecognized resolution", "resolution");
    }
}

9

তুলনা করে মিলিসেকেন্ড বাদ দেওয়ার পরিবর্তে, কেন পার্থক্যটি তুলনা করবেন না?

DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;

অথবা

TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;

3
প্রথম বিকল্পটি কাজ করে না, কারণ টোটাল সেকেন্ডগুলি একটি ডাবল; এটি মিলিসেকেন্ডগুলিও ফেরত দেয়।
জোয়েন

1
পার্থক্য তুলনা তুলনা কাটা পরে তুলনা হিসাবে একই ফলাফল দেয় না। উদাহরণস্বরূপ 5.900 এবং 6.100 এক সেকেন্ডের চেয়ে আলাদা তবে এটি আপনার পদ্ধতির সাথে সমান তুলনা করবে। তবে সঙ্কুচিত মান 5 এবং 6 পৃথক। কোনটি উপযুক্ত তা আপনার প্রয়োজনের উপর নির্ভর করে।
জো

7

কম সুস্পষ্ট তবে ২ বারের বেশি দ্রুত:

// 10000000 runs

DateTime d = DateTime.Now;

// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);

3
মনে রাখবেন যে দ্বিতীয় বিকল্পটি, d.AddMilliseconds(-d.Millisecond)ডেটটাইমকে পূর্ববর্তী, পুরো দ্বিতীয়টিতে অবিচ্ছিন্নভাবে সরানো হয় না। d.Ticks % TimeSpan.TicksPerMillisecondটিক্স (কোথাও 0 এবং 9,999 এর মধ্যে) আপনার দ্বিতীয় থেকে অতিক্রম করবে।
টেকনেটিয়াম

5

দ্বিতীয় দিকে গোল করতে:

dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond)

TicksPerMinuteমিনিট পর্যন্ত গোল করে প্রতিস্থাপন করুন ।


যদি আপনার কোড পারফরম্যান্স সংবেদনশীল হয় তবে সাবধান হন

new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second)

আমার অ্যাপ্লিকেশনটি সিটিইউর 12% সময় সিস্টেম.ডেটটাইম.গেটডেটপার্টে ব্যয় করছিল ।


3

সহজ পাঠের একটি উপায় হ'ল ...

//Remove milliseconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null);

এবং আরও ...

//Remove seconds
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null);

//Remove minutes
DateTime date = DateTime.Now;
date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null);

//and go on...

4
স্ট্রিংগুলিতে রূপান্তর এবং পার্সিং পারফরম্যান্সের দিক থেকে একটি দুর্দান্ত ধারণা।
জেফ পুটজ

2
সত্য @JeffPutz, কিন্তু এটা হয় কিন্তু সহজ। একটি স্বয়ংক্রিয় পরীক্ষার জন্য উপযুক্ত যেখানে কোনও ডিবি থেকে inোকানো এবং টানা মানটি টিকগুলি হারাতে পারে (আমার সঠিক পরিস্থিতি)। তবে এই উত্তরটি এর চেয়ে সহজতর হতে পারে, var now = DateTime.Parse(DateTime.Now.ToString())ঠিক যেমন কাজ করে।
গ্রিম দ্য ওপেনার

1
@ গ্রিম থিওপিনার - "... বেশিরভাগ ক্ষেত্রেই ঠিক কাজ করে" তবে গ্যারান্টিযুক্ত নয়। এটি যা করে তা হ'ল: "বর্তমান সময়ের ব্যবহারকারীর কন্ট্রোল প্যানেল পছন্দ হিসাবে যেমন 'লং টাইম' কনফিগার করা হয়েছে তার যথাযথতার জন্য একটি ডেটটাইমকে গোল করে" যা সাধারণত হয়, তবে সেকেন্ডে অগত্যা হয় না।
জো

1
এর সরলতার মতো, কার্য সম্পাদন স্বয়ংক্রিয় পরীক্ষার পরিস্থিতির জন্য কোনও সমস্যা নয়।
লিয়াং

1

ডায়াডিস্টিস প্রতিক্রিয়া সম্পর্কিত। এটি আমার পক্ষে কাজ করেছিল, গুনের আগে বিভাগের ভগ্নাংশের অংশ অপসারণ করতে আমাকে ফ্লোর ব্যবহার করতে হয়েছিল except সুতরাং,

d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

হয়ে

d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

আমি প্রত্যাশা করতাম যে দুটি দীর্ঘ মূল্যবোধের বিভাজনের ফলে দীর্ঘতর হয়, ফলে দশমিক অংশটি সরিয়ে ফেলা হয়, তবে এটি এটি দ্বিগুণ হিসাবে সমাধান করে ঠিক একই গুণটিকে গুণনের পরে ছেড়ে যায়।

Eppsy


1

উপরে উল্লিখিত সমাধানগুলির জন্য 2 এক্সটেনশন পদ্ধতি

    public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
    {
        DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
        compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);

        return thisDate > compareDate;
    }


    public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
    {
        DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
        compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);

        return thisDate >= compareDate;
    }

ব্যবহার:

bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);

1

দ্রুততম সমাধান নয় তবে সহজ এবং বোঝার জন্য সহজ:

DateTime d = DateTime.Now;
d = d.Date.AddHours(d.Hour).AddMinutes(d.Minute).AddSeconds(d.Second)

0
DateID.Text = DateTime.Today.ToShortDateString();

Use ToShortDateString() //Date 2-02-2016
Use ToShortDateString() // Time 

এবং বাই ইউজ অফ

ToLongDateString() // its show 19 February 2016.

: P: P


-1। আমি দেখতে পাচ্ছি যে প্রশ্নটির stringপরিবর্তে DateTimeএকটিটির পরিবর্তে উত্পাদন করার জন্য জিজ্ঞাসা করা হয়েছিল , তবে এটি আউটপুট থেকে সময়ের উপাদানগুলি পুরোপুরি বাদ দেয় । (এটি Todayসম্পত্তি অ্যাক্সেসকে অপ্রয়োজনীয়ও করে তোলে ))
বেকন

0

নতুন পদ্ধতি

String Date = DateTime.Today.ToString("dd-MMM-yyyy"); 

// স্ট্রিং পাসের প্যারামিটার ডিডি-মিমি-ইয়েই রিটার্ন 24-ফেব -2016 নির্ধারণ করুন

বা পাঠ্যবাক্সে দেখানো হয়েছে

txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");

// পেজোনলডে রাখুন


-1। আমি দেখতে পাচ্ছি যে প্রশ্নটির stringপরিবর্তে DateTimeএকটিটির পরিবর্তে উত্পাদন করার জন্য জিজ্ঞাসা করা হয়েছিল , তবে এটি আউটপুট থেকে সময়ের উপাদানগুলি পুরোপুরি বাদ দেয় । (এটি Todayসম্পত্তি অ্যাক্সেসকে অপ্রয়োজনীয়ও করে তোলে ))
বেকন

0

আমার ক্ষেত্রে, আমি সেকেন্ড এবং মিলিসেকেন্ডগুলি সংরক্ষণ না করে ডেটটাইমপিকার সরঞ্জাম থেকে টাইমস্প্যান সংরক্ষণ করার লক্ষ্য রেখেছিলাম, এবং সমাধানটি এখানে।

প্রথমে ডেটটাইম পিকার.ভাল্যুকে আপনার পছন্দসই বিন্যাসে রূপান্তর করুন, যা খনিটি "এইচএইচ: মিমি" তারপরে এটিকে টাইমস্প্যানে রূপান্তর করুন।

var datetime = datetimepicker1.Value.ToString("HH:mm");
TimeSpan timeSpan = Convert.ToDateTime(datetime).TimeOfDay;

এটির জন্য আরও ভাল উপায় (পরিষ্কার অভিপ্রায়, ফর্ম্যাট করা এবং এ থেকে পার্সিং এড়ানো string) এটাই হবে DateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0); বা আপনি জোয়ের এক্সটেনশন পদ্ধতির বিভিন্নতা ব্যবহার করতে পারেন যা TimeSpanমানগুলিতে কাজ করে এবং TimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));কয়েক সেকেন্ড কাটতে ব্যবহার করতে পারে।
বেকন

0

এটি এখানে এবং অনুরূপ প্রশ্নগুলিতে পোস্ট করা এক্সটেনশন পদ্ধতিগুলির আমার সংস্করণ। এটি টিক্সের মানটিকে সহজেই পঠনযোগ্য পদ্ধতিতে যাচাই করে এবং মূল তারিখটাইমের উদাহরণের ডেটটাইমকিন্ড সংরক্ষণ করে। (মংগোডিবি এর মতো ডেটাবেজে স্টোর করার সময় এর সূক্ষ্ম তবে প্রাসঙ্গিক পার্শ্ব প্রতিক্রিয়া রয়েছে))

সত্যিকারের লক্ষ্যটি যদি একটি নির্দিষ্ট মান (যেমন ঘন্টা / মিনিট / সেকেন্ডস / এমএস) তে ডেটটাইম কেটে দেয় তবে আমি পরিবর্তে আপনার কোডটিতে এই এক্সটেনশন পদ্ধতিটি প্রয়োগ করার পরামর্শ দিচ্ছি। এটি নিশ্চিত করে যে আপনি কেবল একটি বৈধ নির্ভুলতায় ছাঁটাই করতে পারবেন এবং এটি আপনার মূল উদাহরণের গুরুত্বপূর্ণ ডেটটাইমকিন্ড মেটাডেটা সংরক্ষণ করে:

public static DateTime Truncate(this DateTime dateTime, long ticks)
{
    bool isValid = ticks == TimeSpan.TicksPerDay 
        || ticks == TimeSpan.TicksPerHour 
        || ticks == TimeSpan.TicksPerMinute 
        || ticks == TimeSpan.TicksPerSecond 
        || ticks == TimeSpan.TicksPerMillisecond;

    // /programming/21704604/have-datetime-now-return-to-the-nearest-second
    return isValid 
        ? DateTime.SpecifyKind(
            new DateTime(
                dateTime.Ticks - (dateTime.Ticks % ticks)
            ),
            dateTime.Kind
        )
        : throw new ArgumentException("Invalid ticks value given. Only TimeSpan tick values are allowed.");
}

তারপরে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

DateTime dateTime = DateTime.UtcNow.Truncate(TimeSpan.TicksPerMillisecond);

dateTime.Kind => DateTimeKind.Utc

-1

আমি জানি উত্তরটি বেশ দেরিতে তবে মিলিসেকেন্ড থেকে মুক্তি পাওয়ার সর্বোত্তম উপায় হ'ল

var currentDateTime = DateTime.Now.ToString("s");

ভেরিয়েবলের মান মুদ্রণের চেষ্টা করুন, এটি তারিখের সময়টি মিলিসেকেন্ড ছাড়াই প্রদর্শন করবে।


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