Created
April 6, 2013 01:55
-
-
Save AlbertoMonteiro/5324348 to your computer and use it in GitHub Desktop.
RelativeTimeConverter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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