@@ -496,7 +496,7 @@ public static CharSequence getRelativeTimeSpanString(long time, long now, long m
496496 }
497497 }
498498 } else if (duration < WEEK_IN_MILLIS && minResolution < WEEK_IN_MILLIS ) {
499- count = duration / DAY_IN_MILLIS ;
499+ count = getNumberOfDaysPassed ( time , now ) ;
500500 if (past ) {
501501 if (abbrevRelative ) {
502502 resId = com .android .internal .R .plurals .abbrev_num_days_ago ;
@@ -520,6 +520,24 @@ public static CharSequence getRelativeTimeSpanString(long time, long now, long m
520520 return String .format (format , count );
521521 }
522522
523+ /**
524+ * Returns the number of days passed between two dates.
525+ *
526+ * @param date1 first date
527+ * @param date2 second date
528+ * @return number of days passed between to dates.
529+ */
530+ private synchronized static long getNumberOfDaysPassed (long date1 , long date2 ) {
531+ if (sThenTime == null ) {
532+ sThenTime = new Time ();
533+ }
534+ sThenTime .set (date1 );
535+ int day1 = Time .getJulianDay (date1 , sThenTime .gmtoff );
536+ sThenTime .set (date2 );
537+ int day2 = Time .getJulianDay (date2 , sThenTime .gmtoff );
538+ return Math .abs (day2 - day1 );
539+ }
540+
523541 /**
524542 * Return string describing the elapsed time since startTime formatted like
525543 * "[relative time/date], [time]".
@@ -1550,40 +1568,45 @@ public static String formatDateTime(Context context, long millis, int flags) {
15501568 public static CharSequence getRelativeTimeSpanString (Context c , long millis ,
15511569 boolean withPreposition ) {
15521570
1571+ String result ;
15531572 long now = System .currentTimeMillis ();
15541573 long span = now - millis ;
15551574
1556- if ( sNowTime == null ) {
1557- sNowTime = new Time ();
1558- sThenTime = new Time ();
1559- }
1575+ synchronized ( DateUtils . class ) {
1576+ if ( sNowTime == null ) {
1577+ sNowTime = new Time ();
1578+ }
15601579
1561- sNowTime .set (now );
1562- sThenTime .set (millis );
1580+ if (sThenTime == null ) {
1581+ sThenTime = new Time ();
1582+ }
15631583
1564- String result ;
1565- int prepositionId ;
1566- if (span < DAY_IN_MILLIS && sNowTime .weekDay == sThenTime .weekDay ) {
1567- // Same day
1568- int flags = FORMAT_SHOW_TIME ;
1569- result = formatDateRange (c , millis , millis , flags );
1570- prepositionId = R .string .preposition_for_time ;
1571- } else if (sNowTime .year != sThenTime .year ) {
1572- // Different years
1573- int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE ;
1574- result = formatDateRange (c , millis , millis , flags );
1575-
1576- // This is a date (like "10/31/2008" so use the date preposition)
1577- prepositionId = R .string .preposition_for_date ;
1578- } else {
1579- // Default
1580- int flags = FORMAT_SHOW_DATE | FORMAT_ABBREV_MONTH ;
1581- result = formatDateRange (c , millis , millis , flags );
1582- prepositionId = R .string .preposition_for_date ;
1583- }
1584- if (withPreposition ) {
1585- Resources res = c .getResources ();
1586- result = res .getString (prepositionId , result );
1584+ sNowTime .set (now );
1585+ sThenTime .set (millis );
1586+
1587+ int prepositionId ;
1588+ if (span < DAY_IN_MILLIS && sNowTime .weekDay == sThenTime .weekDay ) {
1589+ // Same day
1590+ int flags = FORMAT_SHOW_TIME ;
1591+ result = formatDateRange (c , millis , millis , flags );
1592+ prepositionId = R .string .preposition_for_time ;
1593+ } else if (sNowTime .year != sThenTime .year ) {
1594+ // Different years
1595+ int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR | FORMAT_NUMERIC_DATE ;
1596+ result = formatDateRange (c , millis , millis , flags );
1597+
1598+ // This is a date (like "10/31/2008" so use the date preposition)
1599+ prepositionId = R .string .preposition_for_date ;
1600+ } else {
1601+ // Default
1602+ int flags = FORMAT_SHOW_DATE | FORMAT_ABBREV_MONTH ;
1603+ result = formatDateRange (c , millis , millis , flags );
1604+ prepositionId = R .string .preposition_for_date ;
1605+ }
1606+ if (withPreposition ) {
1607+ Resources res = c .getResources ();
1608+ result = res .getString (prepositionId , result );
1609+ }
15871610 }
15881611 return result ;
15891612 }
0 commit comments