ด้านล่างเป็นวิธีที่แม่นยำที่สุดที่คุณสามารถทำได้เนื่องจากคำจำกัดความของ "1 เดือน" เปลี่ยนแปลงขึ้นอยู่กับว่าเป็นเดือนใดและไม่ใช่คำตอบอื่นที่คำนึงถึงสิ่งนี้! หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่ไม่ได้อยู่ในกรอบคุณสามารถอ่านโพสต์นี้: วัตถุ Real Timepan ด้วย. Years & .Months (อย่างไรก็ตามการอ่านโพสต์นั้นไม่จำเป็นต้องเข้าใจและใช้ฟังก์ชั่นด้านล่างนี้ มันใช้งานได้ 100% โดยไม่ผิดพลาดจากการประมาณที่คนอื่นชอบที่จะใช้ - และรู้สึกอิสระที่จะแทนที่ฟังก์ชัน. Reverse มันด้วยฟังก์ชัน. Reverse ที่คุณมีอยู่ในกรอบงานของคุณ
โปรดทราบว่าคุณสามารถรับวันที่ / เวลาจำนวนวินาทีและนาทีหรือวินาทีวินาทีและวันใด ๆ ไม่เกินปี (ซึ่งจะมี 6 ส่วน / ส่วน) หากคุณระบุสองอันดับแรกและมีอายุเกินหนึ่งปีรายการดังกล่าวจะกลับมา "1 ปีและ 3 เดือนที่ผ่านมา" และจะไม่ส่งคืนส่วนที่เหลือเนื่องจากคุณขอสองกลุ่ม หากมีอายุเพียงไม่กี่ชั่วโมงก็จะกลับมา "2 ชั่วโมงและ 1 นาทีก่อน" แน่นอนว่าจะใช้กฎเดียวกันนี้หากคุณระบุ segmets 1, 2, 3, 4, 5 หรือ 6 (maxes out ที่ 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
แน่นอนว่าคุณจะต้องใช้ฟังก์ชัน "ReplaceLast" ซึ่งรับสตริงต้นฉบับและอาร์กิวเมนต์ที่ระบุสิ่งที่จำเป็นต้องเปลี่ยนและอาร์กิวเมนต์อื่นระบุสิ่งที่คุณต้องการแทนที่ด้วยและจะแทนที่การเกิดครั้งสุดท้ายของสตริงนั้นเท่านั้น ... ฉันได้รวมหนึ่งไว้ถ้าคุณไม่มีหรือไม่ต้องการนำไปใช้ดังนั้นนี่คือมันจะทำงาน "ตามสภาพ" โดยไม่จำเป็นต้องแก้ไข ฉันรู้ว่าฟังก์ชั่น reverseit ไม่ต้องการอีกต่อไป (มีอยู่ใน. net) แต่แทนที่ ReplaceLast และ ReverseIt func ดำเนินการตั้งแต่วันก่อนหน้า. ดังนั้นโปรดแก้ตัวว่าวันที่มันอาจจะดูยังคงใช้งานได้ 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