Skip to content

Instantly share code, notes, and snippets.

@AlbertoMonteiro
Created April 6, 2013 01:55
Show Gist options
  • Save AlbertoMonteiro/5324348 to your computer and use it in GitHub Desktop.
Save AlbertoMonteiro/5324348 to your computer and use it in GitHub Desktop.
RelativeTimeConverter
using System;
using System.Globalization;
using System.Windows.Data;
namespace PorOnde.Converters
{
public class RelativeTimeConverter : IValueConverter
{
private const double Minute = 60.0;
private const double Hour = 60.0*Minute;
private const double Day = 24*Hour;
private const double Week = 7*Day;
private const double Month = 30.5*Day;
private const double Year = 365*Day;
private const string DefaultCulture = "pt-BR";
private string pluralHourStrings;
private string pluralMinuteStrings;
private string pluralSecondStrings;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is DateTime))
throw new ArgumentException("Data invalida.");
string result;
DateTime given = ((DateTime) value).ToLocalTime();
DateTime current = DateTime.Now;
TimeSpan difference = current - given;
SetLocalizationCulture(new CultureInfo("pt-BR"));
if (current > given)
result = GetPluralTimeUnits(2, pluralSecondStrings);
if (difference.TotalSeconds > Year)
result = "a mais de um ano atrás";
else if (difference.TotalSeconds > (1.5*Month))
{
var nMonths = (int) ((difference.TotalSeconds + Month/2)/Month);
result = GetPluralMonth(nMonths);
}
else if (difference.TotalSeconds >= (3.5*Week))
result = "a cerca de um mês atrás";
else if (difference.TotalSeconds >= Week)
{
var nWeeks = (int) (difference.TotalSeconds/Week);
result = nWeeks > 1
? string.Format(CultureInfo.CurrentUICulture, "{0} semanas atrás", nWeeks.ToString(new CultureInfo("pt-BR")))
: "a cerca de uma semana atrás";
}
else if (difference.TotalSeconds >= (5*Day))
result = string.Format(CultureInfo.CurrentUICulture, "na {0} passada", GetDayOfWeek(given.DayOfWeek));
else if (difference.TotalSeconds >= Day)
result = GetOnDayOfWeek(given.DayOfWeek);
else if (difference.TotalSeconds >= (2*Hour))
{
var nHours = (int) (difference.TotalSeconds/Hour);
result = GetPluralTimeUnits(nHours, pluralHourStrings);
}
else if (difference.TotalSeconds >= Hour)
result = "a cerca de uma hora atrás";
else if (difference.TotalSeconds >= (2*Minute))
{
var nMinutes = (int) (difference.TotalSeconds/Minute);
result = GetPluralTimeUnits(nMinutes, pluralMinuteStrings);
}
else if (difference.TotalSeconds >= Minute)
result = "a cerca de um minuto atrás";
else
{
int nSeconds = ((int) difference.TotalSeconds > 1.0) ? (int) difference.TotalSeconds : 2;
result = GetPluralTimeUnits(nSeconds, pluralSecondStrings);
}
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
private void SetLocalizationCulture(CultureInfo culture)
{
if (!culture.Name.Equals(DefaultCulture, StringComparison.Ordinal))
culture = new CultureInfo("pt-BR");
pluralHourStrings = "{0} horas atrás ";
pluralMinuteStrings = "{0} minutos atrás ";
pluralSecondStrings = "{0} segundos atrás";
}
private static string GetPluralMonth(int month)
{
if (month >= 2 && month <= 12)
return string.Format(CultureInfo.CurrentUICulture, "{0} a meses atrás", month.ToString(new CultureInfo("pt-BR")));
throw new ArgumentException("Meses invalido");
}
private static string GetPluralTimeUnits(int units, string format)
{
if (units <= 1)
throw new ArgumentException("Tempo invalido");
return string.Format(CultureInfo.CurrentUICulture, format, units.ToString(new CultureInfo("pt-BR")));
}
private static string GetDayOfWeek(DayOfWeek dow)
{
string result;
switch (dow)
{
case DayOfWeek.Monday:
result = "Segunda";
break;
case DayOfWeek.Tuesday:
result = "Terça";
break;
case DayOfWeek.Wednesday:
result = "Quarta";
break;
case DayOfWeek.Thursday:
result = "Quinta";
break;
case DayOfWeek.Friday:
result = "Sexta";
break;
case DayOfWeek.Saturday:
result = "Sabado";
break;
default:
result = "Domingo";
break;
}
return result;
}
private static string GetOnDayOfWeek(DayOfWeek dow)
{
return string.Format(CultureInfo.CurrentUICulture, "na {0}", GetDayOfWeek(dow));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment