Consiguiendo diferencia de tiempo con una cadena como "Hace un minuto" o "Hace una hora" en Android

Tengo este código en mi PHP

function nicetime($date) { date_default_timezone_set("Asia/Taipei"); if(empty($date)) { return "No date provided"; } $periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade"); $lengths = array("60","60","24","7","4.35","12","10"); $now = time(); $unix_date = strtotime($date); // check validity of date if(empty($unix_date)) { return "Bad date"; } // is it future date or past date if($now > $unix_date) { $difference = $now - $unix_date; $tense = "ago"; } else { $difference = $unix_date - $now; $tense = "from now"; } for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { $difference /= $lengths[$j]; } $difference = round($difference); if($difference != 1) { $periods[$j].= "s"; } return "$difference $periods[$j] {$tense}"; } 

Pero ahora quiero hacer lo mismo, pero esta vez en mi Android. Im que tiene apuro porque la cadena mytime es de una base de datos, en un formato de SQL.

 String mytime = pref.getString("announcementtime" + count, null); 

Salida de mi tiempo:

 2013-08-31 15:55:22 

Quiero convertirlo en:

 23 minutes ago //something like this 

Por favor tenga en cuenta la zona horaria predeterminada y el DateTime = ahora

Está todo en la clase DateUtils .

 CharSequence getRelativeTimeSpanString (long time, long now, long minResolution); 

Te da la diferencia entre tiempo y ahora en un formato como:

Hace 54 segundos.

Para usar la cadena de fecha, primero tiene que convertirla en tiempo de empoch:

 String mytime = pref.getString("announcementtime" + count, null); // it comes out like this 2013-08-31 15:55:22 so adjust the date format SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = df.parse(str); long epoch = date.getTime(); String timePassedString = getRelativeTimeSpanString (epoch, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 

Usted puede modificar la variable de entrada "timeAtMiliseconds", para mi ejemplo estaba en el formato de la fecha estaba en milisegundos.

  public static String parseDate(String timeAtMiliseconds) { if (timeAtMiliseconds.equalsIgnoreCase("")) { return ""; } //API.log("Day Ago "+dayago); String result = "now"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String todayDate = formatter.format(new Date()); Calendar calendar = Calendar.getInstance(); long dayagolong = Long.valueOf(timeAtMiliseconds) * 1000; calendar.setTimeInMillis(dayagolong); String agoformater = formatter.format(calendar.getTime()); Date CurrentDate = null; Date CreateDate = null; try { CurrentDate = formatter.parse(todayDate); CreateDate = formatter.parse(agoformater); long different = Math.abs(CurrentDate.getTime() - CreateDate.getTime()); long secondsInMilli = 1000; long minutesInMilli = secondsInMilli * 60; long hoursInMilli = minutesInMilli * 60; long daysInMilli = hoursInMilli * 24; long elapsedDays = different / daysInMilli; different = different % daysInMilli; long elapsedHours = different / hoursInMilli; different = different % hoursInMilli; long elapsedMinutes = different / minutesInMilli; different = different % minutesInMilli; long elapsedSeconds = different / secondsInMilli; different = different % secondsInMilli; if (elapsedDays == 0) { if (elapsedHours == 0) { if (elapsedMinutes == 0) { if (elapsedSeconds < 0) { return "0" + " s"; } else { if (elapsedDays > 0 && elapsedSeconds < 59) { return "now"; } } } else { return String.valueOf(elapsedMinutes) + "m ago"; } } else { return String.valueOf(elapsedHours) + "h ago"; } } else { if (elapsedDays <= 29) { return String.valueOf(elapsedDays) + "d ago"; } if (elapsedDays > 29 && elapsedDays <= 58) { return "1Mth ago"; } if (elapsedDays > 58 && elapsedDays <= 87) { return "2Mth ago"; } if (elapsedDays > 87 && elapsedDays <= 116) { return "3Mth ago"; } if (elapsedDays > 116 && elapsedDays <= 145) { return "4Mth ago"; } if (elapsedDays > 145 && elapsedDays <= 174) { return "5Mth ago"; } if (elapsedDays > 174 && elapsedDays <= 203) { return "6Mth ago"; } if (elapsedDays > 203 && elapsedDays <= 232) { return "7Mth ago"; } if (elapsedDays > 232 && elapsedDays <= 261) { return "8Mth ago"; } if (elapsedDays > 261 && elapsedDays <= 290) { return "9Mth ago"; } if (elapsedDays > 290 && elapsedDays <= 319) { return "10Mth ago"; } if (elapsedDays > 319 && elapsedDays <= 348) { return "11Mth ago"; } if (elapsedDays > 348 && elapsedDays <= 360) { return "12Mth ago"; } if (elapsedDays > 360 && elapsedDays <= 720) { return "1 year ago"; } if (elapsedDays > 720) { SimpleDateFormat formatterYear = new SimpleDateFormat("MM/dd/yyyy"); Calendar calendarYear = Calendar.getInstance(); calendarYear.setTimeInMillis(dayagolong); return formatterYear.format(calendarYear.getTime()) + ""; } } } catch (java.text.ParseException e) { e.printStackTrace(); } return result; } 

Hay una bonita biblioteca para este propósito en Github: https://github.com/curioustechizen/android-ago

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.