public static string ConvertToRelative(DateTime localDateTime, DateTime localNow, RelativeDateOptions flags = 0) { // This method is intended to return a human readable output, // so this means that the dates passed as input to this method must be local to the user. if (localDateTime.Kind != DateTimeKind.Unspecified) throw new ArgumentException("'localDateTime' must be expressed in practice time-zone.", "localDateTime"); if (localNow.Kind != DateTimeKind.Unspecified) throw new ArgumentException("'localNow' must be expressed in practice time-zone.", "localNow"); // todo: WTF??? this is throwing away needed information for this method... it needs the seconds data. localDateTime = localDateTime.Date; localNow = localNow.Date; TimeSpan span = localNow - localDateTime; bool isPast = span.TotalMinutes > 0; double totalSeconds = Math.Abs(span.TotalSeconds); // a representação textual do DateTime String spelledDate = null; bool requiresPreposition = true; if ((flags & RelativeDateOptions.ReplaceToday) == RelativeDateOptions.ReplaceToday && localDateTime.Date == localNow.Date) { requiresPreposition = false; spelledDate = "hoje"; } else if ((flags & RelativeDateOptions.ReplaceYesterdayAndTomorrow) == RelativeDateOptions.ReplaceYesterdayAndTomorrow && localDateTime.Date == localNow.Date.AddDays(1)) { requiresPreposition = false; spelledDate = "amanhã"; } else if ((flags & RelativeDateOptions.ReplaceYesterdayAndTomorrow) == RelativeDateOptions.ReplaceYesterdayAndTomorrow && localDateTime.Date == localNow.Date.AddDays(-1)) { requiresPreposition = false; spelledDate = "ontem"; } else if (totalSeconds < 172800.0) { if (totalSeconds < 60.0) spelledDate = ((Math.Abs(span.Seconds) == 1) ? "um segundo" : (Math.Abs(span.Seconds) + " segundos")); else if (totalSeconds < 120.0) spelledDate = "um minuto"; else if (totalSeconds < 2700.0) spelledDate = (Math.Abs(span.Minutes) + " minutos"); else if (totalSeconds < 5400.0) spelledDate = "uma hora"; else if (totalSeconds < 86400.0) spelledDate = (Math.Abs(span.Hours) + " horas"); else if (totalSeconds < 172800.0) spelledDate = "um dia"; } else if (totalSeconds < 2592000.0) { requiresPreposition = true; spelledDate = (Math.Abs(span.Days) + " dias"); } else if (totalSeconds < 31104000.0) { requiresPreposition = true; int num2 = Convert.ToInt32(Math.Floor((double)(((double)Math.Abs(span.Days)) / 30.0))); spelledDate = ((num2 <= 1) ? "aprox. um mês" : ("aprox. " + num2 + " meses")); } else { int num3 = Convert.ToInt32(Math.Floor((double)(((double)Math.Abs(span.Days)) / 365.0))); requiresPreposition = true; spelledDate = ((num3 <= 1) ? "aprox. um ano" : ("aprox. " + num3 + " anos")); } if (requiresPreposition & ((flags & RelativeDateOptions.IncludeSuffixes) == RelativeDateOptions.IncludeSuffixes) && isPast) spelledDate += " atrás"; if (requiresPreposition & ((flags & RelativeDateOptions.IncludePrefixes) == RelativeDateOptions.IncludePrefixes)) if (isPast) spelledDate = "há " + spelledDate; else spelledDate = "daqui a " + spelledDate; return spelledDate; }
public static string ConvertToRelative(DateTime localDateTime, DateTime localNow, RelativeDateOptions flags = 0) { // This method is intended to return a human readable output, // so this means that the dates passed as input to this method must be local to the user. if (localDateTime.Kind != DateTimeKind.Unspecified) { throw new ArgumentException("'localDateTime' must be expressed in practice time-zone.", "localDateTime"); } if (localNow.Kind != DateTimeKind.Unspecified) { throw new ArgumentException("'localNow' must be expressed in practice time-zone.", "localNow"); } // todo: WTF??? this is throwing away needed information for this method... it needs the seconds data. localDateTime = localDateTime.Date; localNow = localNow.Date; TimeSpan span = localNow - localDateTime; bool isPast = span.TotalMinutes > 0; double totalSeconds = Math.Abs(span.TotalSeconds); // a representação textual do DateTime String spelledDate = null; bool requiresPreposition = true; if ((flags & RelativeDateOptions.ReplaceToday) == RelativeDateOptions.ReplaceToday && localDateTime.Date == localNow.Date) { requiresPreposition = false; spelledDate = "hoje"; } else if ((flags & RelativeDateOptions.ReplaceYesterdayAndTomorrow) == RelativeDateOptions.ReplaceYesterdayAndTomorrow && localDateTime.Date == localNow.Date.AddDays(1)) { requiresPreposition = false; spelledDate = "amanhã"; } else if ((flags & RelativeDateOptions.ReplaceYesterdayAndTomorrow) == RelativeDateOptions.ReplaceYesterdayAndTomorrow && localDateTime.Date == localNow.Date.AddDays(-1)) { requiresPreposition = false; spelledDate = "ontem"; } else if (totalSeconds < 172800.0) { if (totalSeconds < 60.0) { spelledDate = ((Math.Abs(span.Seconds) == 1) ? "um segundo" : (Math.Abs(span.Seconds) + " segundos")); } else if (totalSeconds < 120.0) { spelledDate = "um minuto"; } else if (totalSeconds < 2700.0) { spelledDate = (Math.Abs(span.Minutes) + " minutos"); } else if (totalSeconds < 5400.0) { spelledDate = "uma hora"; } else if (totalSeconds < 86400.0) { spelledDate = (Math.Abs(span.Hours) + " horas"); } else if (totalSeconds < 172800.0) { spelledDate = "um dia"; } } else if (totalSeconds < 2592000.0) { requiresPreposition = true; spelledDate = (Math.Abs(span.Days) + " dias"); } else if (totalSeconds < 31104000.0) { requiresPreposition = true; int num2 = Convert.ToInt32(Math.Floor((double)(((double)Math.Abs(span.Days)) / 30.0))); spelledDate = ((num2 <= 1) ? "aprox. um mês" : ("aprox. " + num2 + " meses")); } else { int num3 = Convert.ToInt32(Math.Floor((double)(((double)Math.Abs(span.Days)) / 365.0))); requiresPreposition = true; spelledDate = ((num3 <= 1) ? "aprox. um ano" : ("aprox. " + num3 + " anos")); } if (requiresPreposition & ((flags & RelativeDateOptions.IncludeSuffixes) == RelativeDateOptions.IncludeSuffixes) && isPast) { spelledDate += " atrás"; } if (requiresPreposition & ((flags & RelativeDateOptions.IncludePrefixes) == RelativeDateOptions.IncludePrefixes)) { if (isPast) { spelledDate = "há " + spelledDate; } else { spelledDate = "daqui a " + spelledDate; } } return(spelledDate); }