Próbuję osiągnąć, powiedzmy, "społeczny" format daty. Mam już rozwiązanie, ale wydaje mi się, że powinien istnieć lepszy. Dlaczego społeczna i co mam na myśli:Data na ciąg w formacie "społecznym"
Jeśli spojrzymy na Facebooku stempli czasowych stanowisk możemy rozróżnić kolejnych opcji:
- X sekund temu
- X minut temu
- X godzin temu
- Wczoraj o 11:07 am
- piątek o 9:36 pm
- 05 maja o 5:00 pm
- 20 listopada w 9:05 pm, 2012
Zrobiłem kolejny harmonogram wizualną dla lepszego wyjaśnienia:
Na przykład:
Jeśli aktualny czas: 17:33, 20 sek środa
post społeczny się pomiędzy: 0:00 am wtorek < ->17:33, 20 sek wtorek,
następnie format data powinna być jak : Wczoraj o 11:07.
Rozwiązanie Mam:
sprawdzić każdą opcję (7 w liczbie) i powrót 'społeczny' datę ciąg.
ten sposób sprawdzić dla opcji 1:
Date postDate = getPostDate();
Date nowDate = getNowDate();
// check passed seconds
int passedSeconds = getPassedSeconds(postDate, nowDate);
if (passedSeconds < 60)
{
return passedSeconds + " seconds ago";
}
ten sposób sprawdzić dla opcji 4:
// check yesterday
Date startYesterdayDate = getZeroDayBeforeDays(nowDate, 1);
int compare = compare(startYesterdayDate, postDate);
// if postDate comes after startYesterdayDate
if (compare == -1)
{
return "Yesterday at " + getString(postDate, "HH:mma");
}
sprawdzić inne opcje w ten sam sposób.
Niektóre metody używać w razie stwierdzenia powyżej:
public static String getString(Date date, String format)
{
Format formatter = new SimpleDateFormat(format, Locale.US);
String s = formatter.format(date);
return s;
}
/**
* For example: today - 1 day
*
* @param date
* @param numOfMinusDays
* @return
*/
public static Date getDateMinusDays(Date date, int numOfMinusDays)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, (0 - numOfMinusDays));
return calendar.getTime();
}
/**
* Get the day before today at 00:00 am.<br>
* Means, if passed day = <b>Nov 5 13:04</b>, then returned date will be = <b>Nov 4 00:00</b> for days = 1
*
* @param date
* @param days Numner of days to reduce
* @return
*/
public static Date getZeroDayBeforeDays(Date date, int days)
{
Calendar yesterday = Calendar.getInstance();
yesterday.setTime(getDateMinusDays(date, days));
yesterday.set(Calendar.HOUR_OF_DAY, 0);
yesterday.set(Calendar.MINUTE, 0);
yesterday.set(Calendar.SECOND, 0);
yesterday.set(Calendar.MILLISECOND, 1);
return yesterday.getTime();
}
Wreszcie Moje pytania:
Czy istnieje lepszy sposób na konwersję różnicę między dwoma Daty do "społecznego" formatu napisów? Jak już powiedziałem, wydaje mi się, że można zastosować inny sposób, niż być może rozszerzenie obiektu
DateFormat
, ale nie jestem pewien.Jak zlokalizować za sznurki jak „Yesterday” i „at” tak, że różni
Local
zestaw będzie zmienić struny do odpowiedniego języka?
Przepraszam za tak długi pytanie, ale nie mogłem znaleźć krótszą drogę, aby wyjaśnić potrzebę.
Dzięki
Bardzo ciekawe .., wydaje się, że jest to czego szukałem. Sprawdzę tę bibliotekę. Dzięki! – sromku
nie ma za co –