नीचे वास्तव में सबसे सटीक तरीका है जो आप कर सकते हैं, क्योंकि "1 महीना" की परिभाषा किस महीने के आधार पर बदलती है, और अन्य उत्तरों में से कोई भी इसे ध्यान में रखता है! यदि आप उस मुद्दे के बारे में अधिक जानकारी चाहते हैं जो फ्रेमवर्क में निर्मित नहीं है, तो आप इस पोस्ट को पढ़ सकते हैं: A Real Timespan ऑब्जेक्ट With .Years &Month। (हालांकि, उस पोस्ट को पढ़ना नीचे दिए गए फ़ंक्शन को समझने और उपयोग करने के लिए आवश्यक नहीं है, यह 100% काम करता है, सन्निकटन की अंतर्निहित अशुद्धियों के बिना दूसरों को उपयोग करने के लिए प्यार करता है - और बेझिझक इसे प्रतिस्थापित करने के लिए स्वतंत्र महसूस करता है। यह अंतर्निहित फ़ंक्शन के साथ काम करता है। आपके कार्य की रूपरेखा आपके पास हो सकती है (यह सिर्फ यहां पूर्णता के साथ है)।
कृपया ध्यान दें कि आप किसी भी तारीख / समय की सटीकता, सेकंड और मिनट, या सेकंड, मिनट और दिन, कहीं भी वर्षों तक प्राप्त कर सकते हैं (जिसमें 6 भाग / खंड होंगे)। यदि आप शीर्ष दो को निर्दिष्ट करते हैं और यह एक वर्ष से अधिक पुराना है, तो यह "1 वर्ष और 3 महीने पहले" वापस आ जाएगा और बाकी को वापस नहीं लौटाएगा क्योंकि आपने दो खंड खोले हैं। यदि यह केवल कुछ घंटे पुराना है, तो यह केवल "2 घंटे और 1 मिनट पहले" लौटेगा। यदि आप 1, 2, 3, 4, 5 या 6 सेग्मेट्स (6 में अधिकतम निकालते हैं, क्योंकि सेकंड, मिनट, घंटे, दिन, महीने, वर्ष केवल 6 प्रकार बनाते हैं), तो वही नियम लागू होते हैं। यह व्याकरण के मुद्दों को भी ठीक करेगा जैसे "मिनट" बनाम "मिनट" यदि यह 1 मिनट या उससे अधिक है, तो सभी प्रकारों के लिए समान है, और उत्पन्न "स्ट्रिंग" हमेशा व्याकरणिक रूप से सही होगा।
उपयोग के लिए कुछ उदाहरण यहां दिए गए हैं: bAllowSegments यह दिखाता है कि कितने सेगमेंट को दिखाना है ... यानी: यदि 3, तो रिटर्न स्ट्रिंग होगा (उदाहरण के रूप में) ... "3 years, 2 months and 13 days"
(शीर्ष 3 समय के रूप में घंटे, मिनट और सेकंड शामिल नहीं होंगे ) श्रेणियां वापस कर दी जाती हैं), यदि हां, तो तारीख एक नई तारीख थी, जैसे कुछ दिन पहले कुछ, उसी सेगमेंट को निर्दिष्ट करते हुए (3) वापस आ जाएगी"4 days, 1 hour and 13 minutes ago"
इसके बजाय , इसलिए यह सब कुछ ध्यान में रखता है!
अगर bAllowSegments 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
बेशक, आपको एक "रिप्लायस्टैस्ट" फ़ंक्शन की आवश्यकता होगी, जो एक स्रोत स्ट्रिंग लेता है, और एक तर्क निर्दिष्ट करता है जिसे प्रतिस्थापित करने की आवश्यकता है, और एक अन्य arg निर्दिष्ट करता है कि आप इसे किसके साथ बदलना चाहते हैं, और यह केवल उस स्ट्रिंग के अंतिम विचलन को प्रतिस्थापित करता है ... मैंने अपना एक शामिल किया है अगर आपके पास एक नहीं है या न ही इसे लागू करना चाहते हैं, तो यहां यह है, यह "जैसा है" आवश्यक संशोधन के साथ काम करेगा। मुझे पता है कि रिवर्स फ़ंक्शन की अब आवश्यकता नहीं है (.net में मौजूद है) लेकिन रिप्लेसमेंट और ReverseIt func को पूर्व-.net दिनों से खत्म कर दिया गया है, इसलिए कृपया बहाना यह देखो कि यह कैसे लग सकता है (अभी भी 100% tho काम करता है, का उपयोग कर रहा था) दस साल से अधिक के लिए उन्हें गारंटी दे सकते हैं कि वे बग मुक्त हैं ... :)। खुश होती है।
<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