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.

  1. 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 )
  2. ¿Cuál es la mejor manera de conseguir que se alinean en consecuencia?
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top