নীচে আসলে আপনি এটি করতে পারেন সবচেয়ে নিখুঁত উপায়, যেহেতু "1 মাস" সংজ্ঞাটি এটি কোন মাসের উপর নির্ভর করে পরিবর্তিত হয় এবং অন্যান্য উত্তরগুলির মধ্যে এটি এটিকে বিবেচনায় রাখে না! ফ্রেমওয়ার্কে তৈরি না হওয়া ইস্যু সম্পর্কে আপনি যদি আরও তথ্য চান তবে আপনি এই পোস্টটি পড়তে পারেন: রিয়েল টাইমস্প্যান অবজেক্ট উইথ .সালস এবং .মেন্থস (তবে, পোস্টটি নীচের ফাংশনটি বুঝতে এবং ব্যবহার করার প্রয়োজন নেই, এটি অন্যদের ব্যবহার করতে পছন্দ করে এমন আনুষঙ্গিক ভুলগুলি ছাড়াই 100% কাজ করে - এবং অন্তর্নির্মিতের সাথে রিভার্সিট ফাংশনটি প্রতিস্থাপন করতে নির্দ্বিধায় থাকে। আপনার ফ্রেমওয়ার্কটিতে আপনার বিপরীত ফাংশন থাকতে পারে (এটি সম্পূর্ণতার জন্য এখানেই রয়েছে)।
দয়া করে মনে রাখবেন যে আপনি বছরের পর বছর যে কোনও তারিখ / বারের যথার্থতা, সেকেন্ড এবং মিনিট, বা সেকেন্ড, মিনিট এবং দিনগুলি পেতে পারেন (যার মধ্যে 6 অংশ / বিভাগ থাকবে)। আপনি যদি শীর্ষ দুটি উল্লেখ করেন এবং এটি এক বছরেরও বেশি পুরানো হয় তবে এটি "1 বছর 3 মাস আগে" ফিরে আসবে এবং বাকীটি ফিরিয়ে দেবে না কারণ আপনি দুটি বিভাগের জন্য অনুরোধ করেছেন। যদি এটি কয়েক ঘন্টা পুরানো হয় তবে এটি কেবল "2 ঘন্টা 1 মিনিট আগে" ফিরে আসবে। অবশ্যই, যদি আপনি 1, 2, 3, 4, 5 বা 6 সেগমেট নির্দিষ্ট করেন (একই সাথে সেকেন্ড, মিনিট, ঘন্টা, দিন, মাস, বছর কেবল 6 প্রকার তৈরি করে) তবে 6 বা 6 সেগমেট নির্দিষ্ট করে যদি একই নিয়মগুলি প্রযোজ্য। এটি "মিনিট" বনাম "মিনিট" এর মতো ব্যাকরণের সমস্যাগুলিও ঠিক করে দেবে যদি এটি 1 মিনিট বা তারও বেশি, সব ধরণের জন্য একই রকম হয় এবং উত্পন্ন "স্ট্রিং" সর্বদা ব্যাকরণগতভাবে সঠিক থাকে।
এখানে ব্যবহারের জন্য কয়েকটি উদাহরণ দেওয়া হয়েছে: বিএলসলেগমেন্টগুলি সনাক্ত করতে পারে যে কতগুলি বিভাগ দেখানো হবে ... যেমন: যদি 3 হয়, তবে রিটার্ন স্ট্রিংটি হবে (উদাহরণস্বরূপ) ... "3 years, 2 months and 13 days"
(শীর্ষ 3 বার হিসাবে ঘন্টা, মিনিট এবং সেকেন্ড অন্তর্ভুক্ত থাকবে না ) বিভাগগুলি ফেরত দেওয়া হয়েছে), তবে, তারিখটি একটি নতুন তারিখ ছিল, যেমন কিছু দিন আগে কিছু একই বিভাগগুলি (3) উল্লেখ করে ফিরে আসবে"4 days, 1 hour and 13 minutes ago"
পরিবর্তে , সুতরাং এটি সমস্ত কিছু বিবেচনায় নেয়!
যদি বিলেস বিভাগগুলি 2 হয় তবে এটি ফিরে আসবে "3 years and 2 months"
এবং যদি 6 (সর্বাধিক মান) ফিরে আসে "3 years, 2 months, 13 days, 13 hours, 29 minutes and 9 seconds"
তবে মনে করিয়ে দেওয়া হবে যে এটি এর NEVER RETURN
মতো কিছু হবে"0 years, 0 months, 0 days, 3 hours, 2 minutes and 13 seconds ago"
শীর্ষস্থানীয় 3 বিভাগগুলিতে কোনও তারিখের ডেটা নেই এবং এগুলি উপেক্ষা করে আপনি 6 বিভাগগুলি নির্দিষ্ট করে থাকলেও , তাই চিন্তা করবেন না :)। অবশ্যই, যদি এর সাথে 0 এর সাথে কোনও সেগমেন্ট থাকে, তবে স্ট্রিংটি গঠনের সময় এটি বিবেচনায় নেবে "3 days and 4 seconds ago"
এবং "0 ঘন্টা" অংশ হিসাবে প্রদর্শিত হবে এবং উপেক্ষা করবে! উপভোগ করুন এবং ভাল লাগলে মন্তব্য করুন।
Public Function RealTimeUntilNow(ByVal dt As DateTime, Optional ByVal bAllowSegments As Byte = 2) As String
' bAllowSegments identifies how many segments to show... ie: if 3, then return string would be (as an example)...
' "3 years, 2 months and 13 days" the top 3 time categories are returned, if bAllowSegments is 2 it would return
' "3 years and 2 months" and if 6 (maximum value) would return "3 years, 2 months, 13 days, 13 hours, 29 minutes and 9 seconds"
Dim rYears, rMonths, rDays, rHours, rMinutes, rSeconds As Int16
Dim dtNow = DateTime.Now
Dim daysInBaseMonth = Date.DaysInMonth(dt.Year, dt.Month)
rYears = dtNow.Year - dt.Year
rMonths = dtNow.Month - dt.Month
If rMonths < 0 Then rMonths += 12 : rYears -= 1 ' add 1 year to months, and remove 1 year from years.
rDays = dtNow.Day - dt.Day
If rDays < 0 Then rDays += daysInBaseMonth : rMonths -= 1
rHours = dtNow.Hour - dt.Hour
If rHours < 0 Then rHours += 24 : rDays -= 1
rMinutes = dtNow.Minute - dt.Minute
If rMinutes < 0 Then rMinutes += 60 : rHours -= 1
rSeconds = dtNow.Second - dt.Second
If rSeconds < 0 Then rSeconds += 60 : rMinutes -= 1
' this is the display functionality
Dim sb As StringBuilder = New StringBuilder()
Dim iSegmentsAdded As Int16 = 0
If rYears > 0 Then sb.Append(rYears) : sb.Append(" year" & If(rYears <> 1, "s", "") & ", ") : iSegmentsAdded += 1
If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn
If rMonths > 0 Then sb.AppendFormat(rMonths) : sb.Append(" month" & If(rMonths <> 1, "s", "") & ", ") : iSegmentsAdded += 1
If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn
If rDays > 0 Then sb.Append(rDays) : sb.Append(" day" & If(rDays <> 1, "s", "") & ", ") : iSegmentsAdded += 1
If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn
If rHours > 0 Then sb.Append(rHours) : sb.Append(" hour" & If(rHours <> 1, "s", "") & ", ") : iSegmentsAdded += 1
If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn
If rMinutes > 0 Then sb.Append(rMinutes) : sb.Append(" minute" & If(rMinutes <> 1, "s", "") & ", ") : iSegmentsAdded += 1
If bAllowSegments = iSegmentsAdded Then GoTo parseAndReturn
If rSeconds > 0 Then sb.Append(rSeconds) : sb.Append(" second" & If(rSeconds <> 1, "s", "") & "") : iSegmentsAdded += 1
parseAndReturn:
' if the string is entirely empty, that means it was just posted so its less than a second ago, and an empty string getting passed will cause an error
' so we construct our own meaningful string which will still fit into the "Posted * ago " syntax...
If sb.ToString = "" Then sb.Append("less than 1 second")
Return ReplaceLast(sb.ToString.TrimEnd(" ", ",").ToString, ",", " and")
End Function
অবশ্যই, আপনার একটি "রিপ্লেসলাস্ট" ফাংশন প্রয়োজন হবে, যা উত্সের স্ট্রিং গ্রহণ করে এবং একটি যুক্তি যা প্রতিস্থাপন করতে হবে তা নির্দিষ্ট করে এবং অন্যটি যুক্তি যা আপনি এটির সাথে প্রতিস্থাপন করতে চান তা নির্দিষ্ট করে এবং এটি কেবল সেই স্ট্রিংয়ের শেষ ঘটনাটি প্রতিস্থাপন করে ... আমি আপনার একটিকে অন্তর্ভুক্ত করেছি যদি আপনার কাছে এটি না থাকে বা এটি বাস্তবায়ন করতে না চান, সুতরাং এটি এখানে, কোনও সংশোধন প্রয়োজন না করে এটি "যেমন আছে" কাজ করবে। আমি জানি রিভারসিট ফাংশনটির আর প্রয়োজন নেই (নেট এ বিদ্যমান) তবে রিপ্লেসলাস্ট এবং রিভার্সআইট ফানক প্রাক -.net দিন থেকে চালিত হয়, সুতরাং অনুগ্রহ করে এটি কীভাবে তারিখী হতে পারে তা ক্ষমা করবেন (এখনও 100% কাজ করে, ব্যবহার করা হচ্ছে) তাদের দশ বছরেরও বেশি সময় ধরে, তারা বাগ মুক্ত থাকার গ্যারান্টি দিতে পারে) ... :)। চিয়ার্স।
<Extension()> _
Public Function ReplaceLast(ByVal sReplacable As String, ByVal sReplaceWhat As String, ByVal sReplaceWith As String) As String
' let empty string arguments run, incase we dont know if we are sending and empty string or not.
sReplacable = sReplacable.ReverseIt
sReplacable = Replace(sReplacable, sReplaceWhat.ReverseIt, sReplaceWith.ReverseIt, , 1) ' only does first item on reversed version!
Return sReplacable.ReverseIt.ToString
End Function
<Extension()> _
Public Function ReverseIt(ByVal strS As String, Optional ByVal n As Integer = -1) As String
Dim strTempX As String = "", intI As Integer
If n > strS.Length Or n = -1 Then n = strS.Length
For intI = n To 1 Step -1
strTempX = strTempX + Mid(strS, intI, 1)
Next intI
ReverseIt = strTempX + Right(strS, Len(strS) - n)
End Function