Fecha de cálculo de discrepancia (JavaScript VS .NET)
-
29-09-2019 - |
Pregunta
Estoy tratando de calcular el "timeago" y estoy subiendo con un descrepancy en mi código.
Uso Fecha de hoy
7 de noviembre de 2010
Si uso 1 de septiembre de 2010 a continuación, tanto mi código .NET y mi palabra de código JS "2 meses"
Si uso 31 de de agosto de 2010 a continuación, mi código .NET dice "3 meses" y mi código JS dice en 2 meses ""
Esta discrepancia estancias hasta 9 de agosto de 2010 .
Básicamente, el DATEDIFF es "off" del 10 de agosto - 31. De agosto de hoy basado en la fecha de 7 de noviembre
Aquí está el código JavaScript (tomado de " timeago " plug-in)
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));
Y aquí está mi código .NET (escrito por mí)
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
Así que el problema que estoy teniendo es un derecho fundamental, así como una logística.
- Para saber qué código es "correcto" cuando se trata de DifFecha? ( IE:? Es de 2 meses y 14 días considerados 2 meses o 3 )
- ¿Cuál es la mejor manera de conseguir que se alinean en consecuencia?
Solución
Made algunas suposiciones y tenía que escribir en C #, pero esta versión del código me da 2 meses para el 31 de agosto y 3 meses para el 9 de agosto de
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;
}
He actualizado el código y creo que tenga los resultados que usted está esperando ahora. Hopefuly esto ayudará.
Saludos, Wagner.