2013-06-02 10 views
10

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:

  1. X sekund temu
  2. X minut temu
  3. X godzin temu
  4. Wczoraj o 11:07 am
  5. piątek o 9:36 pm
  6. 05 maja o 5:00 pm
  7. 20 listopada w 9:05 pm, 2012

Zrobiłem kolejny harmonogram wizualną dla lepszego wyjaśnienia: enter image description here
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:

  1. 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.

  2. 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

Odpowiedz

3

Jest już jeden realizowany biblioteka, że ​​jeśli nie chcemy, aby ponownie wymyślać koła za

Zobacz PrettyTime przy wsparciu lokalizacyjnej

PrettyTime p = new PrettyTime(); 
System.out.println(p.format(new Date())); 
//prints: “right now” 

System.out.println(p.format(new Date(1000*60*10))); 
//prints: “10 minutes from now” 
+0

Bardzo ciekawe .., wydaje się, że jest to czego szukałem. Sprawdzę tę bibliotekę. Dzięki! – sromku

+0

nie ma za co –

Powiązane problemy