تناقض حساب التاريخ (JavaScript vs .NET)
-
29-09-2019 - |
سؤال
أحاول حساب "timeago" وأنا أتوصل إلى إزالة الكود في الكود الخاص بي.
باستخدام تاريخ اليوم
7 نوفمبر 2010
إذا استخدمت 1 سبتمبر 2010 ثم يقول كل من رمز .NET ورمز JS الخاص بي "شهرين"
إذا استخدمت 31 أغسطس 2010 ثم يقول رمز .NET الخاص بي "3 أشهر" ورمز JS الخاص بي يقول في "شهرين"
هذا التناقض يبقى حتى 9 أغسطس 2010.
في الأساس ، يتم "Off" من 10 أغسطس إلى 31 أغسطس بناءً على تاريخ اليوم في 7 نوفمبر.
ها هي جافا سكريبت (مأخوذة من "زمن مضى" توصيل في)
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 48 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.floor(days)) ||
days < 60 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.floor(days / 30)) ||
years < 2 && substitute($l.year, 1) ||
substitute($l.years, Math.floor(years));
وهنا رمز .NET الخاص بي (كتبه)
Public Function ToDuration(ByVal dt As Date?, _
Optional ByVal suffixAgo As String = Nothing) As String
If Not dt Is Nothing Then
Dim theDate As Date = dt
Dim SecondsAppart As Integer = DateDiff(DateInterval.Second, theDate, Now)
Dim output As String
If SecondsAppart < 86400 Then
Select Case SecondsAppart
Case Is <= 59 : output = "less than a minute " & suffixAgo
Case Is <= 119 : output = "about a minute " & suffixAgo
Case Is <= 3599 : output = DateDiff(DateInterval.Minute, theDate, Now) & " minutes " & suffixAgo
Case Is <= 7199 : output = "about an hour " & suffixAgo
Case Else : output = DateDiff(DateInterval.Hour, theDate, Now) & " hours " & suffixAgo
End Select
Else
Dim DaysAppart As Integer = DateDiff(DateInterval.Day, theDate, Now)
Select Case DaysAppart
Case Is <= 1 : output = "yesterday"
Case Is <= 30 : output = DateDiff(DateInterval.Day, theDate, Now) & " days " & suffixAgo
Case Is <= 60 : output = "about a month " & suffixAgo
Case Is <= 365 : output = DateDiff(DateInterval.Month, theDate, Now) & " months " & suffixAgo
Case Is <= 730 : output = "about a year " & suffixAgo
Case Else : output = DateDiff(DateInterval.Year, theDate, Now) & " years " & suffixAgo
End Select
End If
Return output
Else
Return String.Empty
End If
End Function
لذا فإن المشكلة التي أواجهها هي مشكلة أساسية وكذلك لوجستية.
- ما هو الرمز "الصحيح" عندما يتعلق الأمر بـ Datediff؟ ((أي: هل يعتبر شهرين و 14 يومًا شهرين أو 3؟)
- ما هي أفضل طريقة لجعلهم يصطفون وفقًا لذلك؟
المحلول
قدمت بعض الافتراضات واضطررت إلى كتابتها في C#، لكن هذا الإصدار من الكود يعطيني شهرين لمدة 31 و 3 أشهر في 9 أغسطس
public static string ToDuration(DateTime dt, string suffixAgo)
{
string output;
DateTime theDate;
if (dt == null)
{
output = "now";
}
else
{
theDate = dt;
TimeSpan DateInterval = DateTime.Now - theDate;
int SecondsAppart = Convert.ToInt32(Math.Floor(DateInterval.TotalSeconds));
if ((SecondsAppart < 86400))
{
if (SecondsAppart < 59)
output = ("less than a minute " + suffixAgo);
else if (SecondsAppart < 119)
output = ("about a minute " + suffixAgo);
else if (SecondsAppart < 3599)
output = string.Format("{0} minutes {1}", Math.Floor(DateInterval.TotalMinutes), suffixAgo);
else if (SecondsAppart < 7199)
output = "about an hour " + suffixAgo;
else
output = string.Format("{0} hours {1}", Math.Floor(DateInterval.TotalHours), suffixAgo);
}
else
{
int DaysAppart = Convert.ToInt32(DateInterval.TotalDays);
if (DaysAppart <= 1)
output = "yesterday";
else if (DaysAppart < 30)
output = string.Format("{0} days {1}", Math.Floor(DateInterval.TotalDays), suffixAgo);
else if (DaysAppart < 60)
output = "about a month " + suffixAgo;
else if (DaysAppart < 365)
output = string.Format("{0} months {1}", Math.Floor(DateInterval.TotalDays/30), suffixAgo);
else if (DaysAppart < 730)
output = ("about a year " + suffixAgo);
else
output = string.Format("{0} year {1}", Math.Floor(DateInterval.TotalDays/365), suffixAgo);
}
}
return output;
}
لقد قمت بتحديث الرمز وأعتقد أن لديك النتائج التي تتوقعها الآن. يأمل هذا سوف يساعد.
هتاف ، فاغنر.