2010-10-04 1 views
102

В Ruby on Rails есть функция, которая позволяет вам принимать любую дату и распечатывать, как это было «давно».Как рассчитать «время назад» в Java?

Например:

8 minutes ago 
8 hours ago 
8 days ago 
8 months ago 
8 years ago 

Есть простой способ сделать это в Java?

+1

См: Http: // stackoverflow.com/questions/11/how-do-calculate-relative-time Это C#, но я уверен, что вы можете преобразовать его с небольшими проблемами. – Brandon

ответ

148

Посмотрите на библиотеку PrettyTime.

Это довольно простая в использовании:

import org.ocpsoft.prettytime.PrettyTime; 

PrettyTime p = new PrettyTime(); 
System.out.println(p.format(new Date())); 
// prints "moments ago" 

Вы также можете передать в локали для создания многоязычных сообщений:

PrettyTime p = new PrettyTime(new Locale("fr")); 
System.out.println(p.format(new Date())); 
// prints "à l'instant" 

Как отмечено в комментариях, Android имеет такую ​​функциональность, встроенный в android.text.format.DateUtils класс ,

+196

В случае, если вы работаете над android, вы можете использовать это: android.text.format.DateUtils # getRelativeTimeSpanString() – Somatik

+0

Можете ли вы добавить еще несколько описаний в свой ответ, ссылка только ответ пока не подходит. –

+0

@Somatik, если вам нужно получить это на платформе, отличной от android, вы можете [просмотреть этот класс] (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/ java/android/text/format/DateUtils.java) на AOSP. – greg7gkb

3

Пакет joda-time, имеет понятие Periods. Вы можете сделать арифметику с периодами и DateTimes.

От docs:

public boolean isRentalOverdue(DateTime datetimeRented) { 
    Period rentalPeriod = new Period().withDays(2).withHours(12); 
    return datetimeRented.plus(rentalPeriod).isBeforeNow(); 
} 
66

Рассматривали ли вы TimeUnit перечисление? Это может быть очень полезно для такого рода вещи

try { 
     SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
     Date past = format.parse("01/10/2010"); 
     Date now = new Date(); 

     System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime() - past.getTime()) + " milliseconds ago"); 
     System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime() - past.getTime()) + " minutes ago"); 
     System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime() - past.getTime()) + " hours ago"); 
     System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime() - past.getTime()) + " days ago"); 
    } 
    catch (Exception j){ 
     j.printStackTrace(); 
    } 
+1

Я не думаю, что это полный ответ, поскольку единицы времени независимы. Например, миллисекундное время составляет всего лишь минутное время * 60 * 1000. Вам нужно уменьшать от единицы времени, что следующий блок большего времени (после преобразования его в нижний блок времени), чтобы иметь возможность использовать его в «время назад» "строка. – Nativ

+0

** @ Бендж ** - Правильно? выше решения? потому что одно время находится в 12-часовом формате, а другое время - в 24-часовом формате. Сообщите мне свои отзывы по моему запросу. Заранее благодарю. – Swift

+0

это неверно, хотя ... каждая единица не зависит от друг друга, как уже упоминалось. –

41
public class TimeUtils { 

     public final static long ONE_SECOND = 1000; 
     public final static long SECONDS = 60; 

     public final static long ONE_MINUTE = ONE_SECOND * 60; 
     public final static long MINUTES = 60; 

     public final static long ONE_HOUR = ONE_MINUTE * 60; 
     public final static long HOURS = 24; 

     public final static long ONE_DAY = ONE_HOUR * 24; 

     private TimeUtils() { 
     } 

     /** 
     * converts time (in milliseconds) to human-readable format 
     * "<w> days, <x> hours, <y> minutes and (z) seconds" 
     */ 
     public static String millisToLongDHMS(long duration) { 
     StringBuffer res = new StringBuffer(); 
     long temp = 0; 
     if (duration >= ONE_SECOND) { 
      temp = duration/ONE_DAY; 
      if (temp > 0) { 
      duration -= temp * ONE_DAY; 
      res.append(temp).append(" day").append(temp > 1 ? "s" : "") 
       .append(duration >= ONE_MINUTE ? ", " : ""); 
      } 

      temp = duration/ONE_HOUR; 
      if (temp > 0) { 
      duration -= temp * ONE_HOUR; 
      res.append(temp).append(" hour").append(temp > 1 ? "s" : "") 
       .append(duration >= ONE_MINUTE ? ", " : ""); 
      } 

      temp = duration/ONE_MINUTE; 
      if (temp > 0) { 
      duration -= temp * ONE_MINUTE; 
      res.append(temp).append(" minute").append(temp > 1 ? "s" : ""); 
      } 

      if (!res.toString().equals("") && duration >= ONE_SECOND) { 
      res.append(" and "); 
      } 

      temp = duration/ONE_SECOND; 
      if (temp > 0) { 
      res.append(temp).append(" second").append(temp > 1 ? "s" : ""); 
      } 
      return res.toString(); 
     } else { 
      return "0 second"; 
     } 
     } 


     public static void main(String args[]) { 
     System.out.println(millisToLongDHMS(123)); 
     System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123)); 
     System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR)); 
     System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND)); 
     System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE))); 
     System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR) 
      + (2 * ONE_MINUTE) + ONE_SECOND)); 
     System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR) 
      + ONE_MINUTE + (23 * ONE_SECOND) + 123)); 
     System.out.println(millisToLongDHMS(42 * ONE_DAY)); 
     /* 
      output : 
       0 second 
       5 seconds 
       1 day, 1 hour 
       1 day and 2 seconds 
       1 day, 1 hour, 2 minutes 
       4 days, 3 hours, 2 minutes and 1 second 
       5 days, 4 hours, 1 minute and 23 seconds 
       42 days 
     */ 
    } 
} 

больше @Format a duration in milliseconds into a human-readable format

+0

Я закончил с использованием пересмотренной версии этого. Добавлено мои изменения для вас. –

+4

Дэвид Блевинс, больше примеров о PrettyTime: http://stackoverflow.com/questions/3859288/how-to-calculate-time-ago-in-java Большой -1 для повторного создания колеса и не рекомендуя стороннюю библиотеку :-p – zakmck

9

Это основано на ответе RealHowTo, поэтому, если вам это нравится, дайте ему некоторую любовь.

Это очищены версия позволяет указать диапазон времени, которое вы могли бы быть заинтересованы.

Он также обрабатывает «и» часть немного по-другому. Я часто нахожу, когда присоединяюсь к строкам с разделителем, проще пропустить сложную логику и просто удалить последний разделитель, когда закончите.

import java.util.concurrent.TimeUnit; 
import static java.util.concurrent.TimeUnit.MILLISECONDS; 

public class TimeUtils { 

    /** 
    * Converts time to a human readable format within the specified range 
    * 
    * @param duration the time in milliseconds to be converted 
    * @param max  the highest time unit of interest 
    * @param min  the lowest time unit of interest 
    */ 
    public static String formatMillis(long duration, TimeUnit max, TimeUnit min) { 
     StringBuilder res = new StringBuilder(); 

     TimeUnit current = max; 

     while (duration > 0) { 
      long temp = current.convert(duration, MILLISECONDS); 

      if (temp > 0) { 
       duration -= current.toMillis(temp); 
       res.append(temp).append(" ").append(current.name().toLowerCase()); 
       if (temp < 2) res.deleteCharAt(res.length() - 1); 
       res.append(", "); 
      } 

      if (current == min) break; 

      current = TimeUnit.values()[current.ordinal() - 1]; 
     } 

     // clean up our formatting.... 

     // we never got a hit, the time is lower than we care about 
     if (res.lastIndexOf(", ") < 0) return "0 " + min.name().toLowerCase(); 

     // yank trailing ", " 
     res.deleteCharAt(res.length() - 2); 

     // convert last ", " to " and" 
     int i = res.lastIndexOf(", "); 
     if (i > 0) { 
      res.deleteCharAt(i); 
      res.insert(i, " and"); 
     } 

     return res.toString(); 
    } 
} 

Маленький код, чтобы дать ему кружить:

import static java.util.concurrent.TimeUnit.*; 

public class Main { 

    public static void main(String args[]) { 
     long[] durations = new long[]{ 
      123, 
      SECONDS.toMillis(5) + 123, 
      DAYS.toMillis(1) + HOURS.toMillis(1), 
      DAYS.toMillis(1) + SECONDS.toMillis(2), 
      DAYS.toMillis(1) + HOURS.toMillis(1) + MINUTES.toMillis(2), 
      DAYS.toMillis(4) + HOURS.toMillis(3) + MINUTES.toMillis(2) + SECONDS.toMillis(1), 
      DAYS.toMillis(5) + HOURS.toMillis(4) + MINUTES.toMillis(1) + SECONDS.toMillis(23) + 123, 
      DAYS.toMillis(42) 
     }; 

     for (long duration : durations) { 
      System.out.println(TimeUtils.formatMillis(duration, DAYS, SECONDS)); 
     } 

     System.out.println("\nAgain in only hours and minutes\n"); 

     for (long duration : durations) { 
      System.out.println(TimeUtils.formatMillis(duration, HOURS, MINUTES)); 
     } 
    } 

} 

Какой будет выводить следующее:

0 seconds 
5 seconds 
1 day and 1 hour 
1 day and 2 seconds 
1 day, 1 hour and 2 minutes 
4 days, 3 hours, 2 minutes and 1 second 
5 days, 4 hours, 1 minute and 23 seconds 
42 days 

Again in only hours and minutes 

0 minutes 
0 minutes 
25 hours 
24 hours 
25 hours and 2 minutes 
99 hours and 2 minutes 
124 hours and 1 minute 
1008 hours 

И в случае, если кто-либо нуждается в ней, вот это класс, который будет преобразовывать любой как указано выше back into milliseconds. Это очень полезно для того, чтобы позволить людям указывать тайм-ауты разных вещей в читаемом тексте.

4

Я создал простой порт Java timeago плагина jquery-timeago, который делает то, о чем вы просите.

TimeAgo time = new TimeAgo(); 
String minutes = time.timeAgo(System.currentTimeMillis() - (15*60*1000)); // returns "15 minutes ago" 
8

есть простой способ сделать это:

скажем, вы хотите, время 20 минут назад:

Long minutesAgo = new Long(20); 
Date date = new Date(); 
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000); 

вот это ..

+1

В большинстве случаев вам нужен «умный» дисплей, т.е. вместо 5125 минут назад, вы скажете x дней назад. – PhiLho

+0

Что делать, если вам нужна информация о локали? –

5

Если вы ищете простой «Сегодня», «Вчера» или «x дней назад».

private String getDaysAgo(Date date){ 
    long days = (new Date().getTime() - date.getTime())/86400000; 

    if(days == 0) return "Today"; 
    else if(days == 1) return "Yesterday"; 
    else return days + " days ago"; 
} 
29

Я принимаю RealHowTo и Бен J ответы и сделать свою собственную версию:

public class TimeAgo { 
public static final List<Long> times = Arrays.asList(
     TimeUnit.DAYS.toMillis(365), 
     TimeUnit.DAYS.toMillis(30), 
     TimeUnit.DAYS.toMillis(1), 
     TimeUnit.HOURS.toMillis(1), 
     TimeUnit.MINUTES.toMillis(1), 
     TimeUnit.SECONDS.toMillis(1)); 
public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second"); 

public static String toDuration(long duration) { 

    StringBuffer res = new StringBuffer(); 
    for(int i=0;i< TimeAgo.times.size(); i++) { 
     Long current = TimeAgo.times.get(i); 
     long temp = duration/current; 
     if(temp>0) { 
      res.append(temp).append(" ").append(TimeAgo.timesString.get(i)).append(temp != 1 ? "s" : "").append(" ago"); 
      break; 
     } 
    } 
    if("".equals(res.toString())) 
     return "0 seconds ago"; 
    else 
     return res.toString(); 
} 
public static void main(String args[]) { 
    System.out.println(toDuration(123)); 
    System.out.println(toDuration(1230)); 
    System.out.println(toDuration(12300)); 
    System.out.println(toDuration(123000)); 
    System.out.println(toDuration(1230000)); 
    System.out.println(toDuration(12300000)); 
    System.out.println(toDuration(123000000)); 
    System.out.println(toDuration(1230000000)); 
    System.out.println(toDuration(12300000000L)); 
    System.out.println(toDuration(123000000000L)); 
}} 

, который будет печатать следующие

0 second ago 
1 second ago 
12 seconds ago 
2 minutes ago 
20 minutes ago 
3 hours ago 
1 day ago 
14 days ago 
4 months ago 
3 years ago 
+0

Действительно круто. И действительно легко добавить другие единицы времени, такие как неделя (ы) – Piotr

+1

, этот человек заслуживает большего внимания. Прежде всего, библиотека не нужна. Он по-прежнему чистый, элегантный и легко меняющийся. – fangzhzh

+0

маленькая опечатка: внутри вашего кода вы ссылаетесь на статические свойства «Списки» вместо «TimeAgo». List.times.get (i) должен быть TimeAgo.get (i) ... и т. Д. –

6

java.time

Использование java.time рамки встроенный в Java 8 и более поздние версии.

LocalDateTime t1 = LocalDateTime.of(2015, 1, 1, 0, 0, 0); 
LocalDateTime t2 = LocalDateTime.now(); 
Period period = Period.between(t1.toLocalDate(), t2.toLocalDate()); 
Duration duration = Duration.between(t1, t2); 

System.out.println("First January 2015 is " + period.getYears() + " years ago"); 
System.out.println("First January 2015 is " + period.getMonths() + " months ago"); 
System.out.println("First January 2015 is " + period.getDays() + " days ago"); 
System.out.println("First January 2015 is " + duration.toHours() + " hours ago"); 
System.out.println("First January 2015 is " + duration.toMinutes() + " minutes ago"); 
+0

Эти методы «Длительность» сообщают о длительности * всего * в виде общего количества часов и общего количества минут. В Java 8 у класса странно отсутствовали методы получения каждой * части * часа, минут и секунд. Java 9 приносит эти методы, 'to ... Part'. –

1

После долгих исследований я нашел это.

public class GetTimeLapse { 
    public static String getlongtoago(long createdAt) { 
     DateFormat userDateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy"); 
     DateFormat dateFormatNeeded = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS"); 
     Date date = null; 
     date = new Date(createdAt); 
     String crdate1 = dateFormatNeeded.format(date); 

     // Date Calculation 
     DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
     crdate1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date); 

     // get current date time with Calendar() 
     Calendar cal = Calendar.getInstance(); 
     String currenttime = dateFormat.format(cal.getTime()); 

     Date CreatedAt = null; 
     Date current = null; 
     try { 
      CreatedAt = dateFormat.parse(crdate1); 
      current = dateFormat.parse(currenttime); 
     } catch (java.text.ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // Get msec from each, and subtract. 
     long diff = current.getTime() - CreatedAt.getTime(); 
     long diffSeconds = diff/1000; 
     long diffMinutes = diff/(60 * 1000) % 60; 
     long diffHours = diff/(60 * 60 * 1000) % 24; 
     long diffDays = diff/(24 * 60 * 60 * 1000); 

     String time = null; 
     if (diffDays > 0) { 
      if (diffDays == 1) { 
       time = diffDays + "day ago "; 
      } else { 
       time = diffDays + "days ago "; 
      } 
     } else { 
      if (diffHours > 0) { 
       if (diffHours == 1) { 
        time = diffHours + "hr ago"; 
       } else { 
        time = diffHours + "hrs ago"; 
       } 
      } else { 
       if (diffMinutes > 0) { 
        if (diffMinutes == 1) { 
         time = diffMinutes + "min ago"; 
        } else { 
         time = diffMinutes + "mins ago"; 
        } 
       } else { 
        if (diffSeconds > 0) { 
         time = diffSeconds + "secs ago"; 
        } 
       } 

      } 

     } 
     return time; 
    } 
} 
2

В случае, если вы разрабатываете приложение для Android, она обеспечивает вспомогательный класс DateUtils для всех таких требований. Взгляните на полезный метод DateUtils#getRelativeTimeSpanString().

Из документов для

CharSequence getRelativeTimeSpanString (долгое время, долго теперь, долго minResolution)

Возвращает строку, описывающую 'время' как раз по отношению к 'теперь'. Временные промежутки в прошлом отформатированы как «42 минуты назад». Временные промежутки в будущем отформатированы как «Через 42 минуты».

Вы проездом свой timestamp, как время и System.currentTimeMillis(), как теперь. minResolution позволяет указать минимальный промежуток времени для отчета.

Например, время, в течение которого прошло 3 секунды, будет указано как «0 минут назад», если установлено значение MINUTE_IN_MILLIS. Пропустите один из 0, MINUTE_IN_MILLIS, HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS и т.д.

5

О встроенный решений:

Java не имеет встроенной поддержки для форматирования относительного времени, также не Java-8 и его новый пакет java.time. Если вам нужен только английский язык и ничего больше, и только тогда может быть приемлемым решение для рук - см. Ответ @RealHowTo (хотя у него есть сильный недостаток, чтобы не учитывать часовой пояс для перевода мгновенных дельт в местное время единицы!).Во всяком случае, если вы хотите избежать домашних сложных сложных обходов, особенно для других мест, вам нужна внешняя библиотека.

В последнем случае я рекомендую использовать свою библиотеку Time4J (или Time4A на Android). Он предлагает максимальную гибкость и большую мощность i18n. Класс net.time4j.PrettyTime имеет семь методов printRelativeTime...(...) для этой цели. Пример с использованием тест-часы в качестве источника времени:

TimeSource<?> clock =() -> PlainTimestamp.of(2015, 8, 1, 10, 24, 5).atUTC(); 
Moment moment = PlainTimestamp.of(2015, 8, 1, 17, 0).atUTC(); // our input 
String durationInDays = 
    PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative(
    moment, 
    Timezone.of(EUROPE.BERLIN), 
    TimeUnit.DAYS); // controlling the precision 
System.out.println(durationInDays); // heute (german word for today) 

Другой пример использования java.time.Instant в качестве входных данных:

String relativeTime = 
    PrettyTime.of(Locale.ENGLISH) 
    .printRelativeInStdTimezone(Moment.from(Instant.EPOCH)); 
System.out.println(relativeTime); // 45 years ago 

Эта библиотека поддерживает с помощью последней версии (v4.17) 80 языков, а также некоторые страны (особенно для испанского, английского, арабского, французского). Данные i18n в основном основаны на новейшей версии CLDR-версии v29. Другими важными причинами использования этой библиотеки являются хорошие поддержка множественных правил (которые часто отличаются от английского языка в других местах), стиль сокращенного формата (например: «1 секунда назад») и выразительные способы для принимая во внимание время на часах. Time4J даже знает о таких экзотических деталях, как скачков секунд в расчетах относительных времен (не очень важно, но он формирует сообщение, связанное с горизонтом ожидания). Совместимость с Java-8 существует благодаря легкодоступным способам преобразования для таких типов, как java.time.Instant или java.time.Period.

Есть ли недостатки? Только два.

  • Библиотека не маленькая (также из-за большого хранилища данных i18n).
  • API не известен, поэтому знания и поддержка сообщества недоступны, но в остальном поставляемая документация является довольно подробной и всеобъемлющей.

(Compact) альтернативы:

Если вы ищете меньшее решение и не нужны так много возможностей, и готовы терпеть возможные проблемы качества, связанные с i18n-данные затем:

  • Я бы порекомендовал ocpsoft/PrettyTime (поддержка фактически 32 языков (скоро 34), пригодных для работы с java.util.Date только - увидеть ответ @ataylor). Промышленный стандарт CLDR (из консорциума Unicode) с его большим фондом сообщества, к сожалению, не является базой данных i18n, поэтому дальнейшее улучшение или улучшение данных может занять некоторое время ...

  • Если вы находитесь на Android, то Вспомогательный класс android.text.format.DateUtils - это тонкая встроенная альтернатива (см. другие комментарии и ответы здесь, с тем недостатком, что у нее нет поддержки годами и месяцами. И я уверен, что только очень немногие люди любят API-стиль этого вспомогательный класс.

  • Если вы являетесь поклонником Joda-Time, то вы можете посмотреть на его класс PeriodFormat (поддержка 14-ла nguages ​​в версии v2.9.4, с другой стороны: Joda-Time, конечно же, не является компактным, поэтому я упоминаю его здесь только для полноты). Эта библиотека не является реальным ответом, потому что относительное время вообще не поддерживается. Вам нужно будет добавить литерал «назад», по крайней мере (и вручную отключить все нижние единицы из сформированных форматов списков - неудобно). В отличие от Time4J или Android-DateUtils, у нее нет специальной поддержки сокращений или автоматического переключения с относительных времен на представления абсолютного времени. Как и PrettyTime, он полностью зависит от неподтвержденных вкладов частных членов Java-сообщества в его i18n-данные.

1

Вы можете использовать эту функцию, чтобы вычислить время назад

private String timeAgo(long time_ago) { 
     long cur_time = (Calendar.getInstance().getTimeInMillis())/1000; 
     long time_elapsed = cur_time - time_ago; 
     long seconds = time_elapsed; 
     int minutes = Math.round(time_elapsed/60); 
     int hours = Math.round(time_elapsed/3600); 
     int days = Math.round(time_elapsed/86400); 
     int weeks = Math.round(time_elapsed/604800); 
     int months = Math.round(time_elapsed/2600640); 
     int years = Math.round(time_elapsed/31207680); 

     // Seconds 
     if (seconds <= 60) { 
      return "just now"; 
     } 
     //Minutes 
     else if (minutes <= 60) { 
      if (minutes == 1) { 
       return "one minute ago"; 
      } else { 
       return minutes + " minutes ago"; 
      } 
     } 
     //Hours 
     else if (hours <= 24) { 
      if (hours == 1) { 
       return "an hour ago"; 
      } else { 
       return hours + " hrs ago"; 
      } 
     } 
     //Days 
     else if (days <= 7) { 
      if (days == 1) { 
       return "yesterday"; 
      } else { 
       return days + " days ago"; 
      } 
     } 
     //Weeks 
     else if (weeks <= 4.3) { 
      if (weeks == 1) { 
       return "a week ago"; 
      } else { 
       return weeks + " weeks ago"; 
      } 
     } 
     //Months 
     else if (months <= 12) { 
      if (months == 1) { 
       return "a month ago"; 
      } else { 
       return months + " months ago"; 
      } 
     } 
     //Years 
     else { 
      if (years == 1) { 
       return "one year ago"; 
      } else { 
       return years + " years ago"; 
      } 
     } 
    } 

1) Здесь TIME_AGO находится в микросекунду

0

Вот мой Java Реализация этого

public static String relativeDate(Date date){ 
    Date now=new Date(); 
    if(date.before(now)){ 
    int days_passed=(int) TimeUnit.MILLISECONDS.toDays(now.getTime() - date.getTime()); 
    if(days_passed>1)return days_passed+" days ago"; 
    else{ 
     int hours_passed=(int) TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime()); 
     if(hours_passed>1)return days_passed+" hours ago"; 
     else{ 
      int minutes_passed=(int) TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime()); 
      if(minutes_passed>1)return minutes_passed+" minutes ago"; 
      else{ 
       int seconds_passed=(int) TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime()); 
       return seconds_passed +" seconds ago"; 
      } 
     } 
    } 

    } 
    else 
    { 
     return new SimpleDateFormat("HH:mm:ss MM/dd/yyyy").format(date).toString(); 
    } 
    } 
1

Для Android Точно так же, как сказал Рави, но так как много людей хотят просто скопируйте пасту вещь здесь.

try { 
     SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z"); 
     Date dt = formatter.parse(date_from_server); 
     CharSequence output = DateUtils.getRelativeTimeSpanString (dt.getTime()); 
     your_textview.setText(output.toString()); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     your_textview.setText(""); 
    } 

Объяснение для людей, которые имеют больше времени

  1. Вы получаете данные где-то. Сначала вам нужно выяснить его формат.

Ex. Я получаю данные с сервера в формате Ср, 27 января 2016 9:32:35 GMT [Вероятно, это не ваш случай]

это переводится в

SimpleDateFormat форматировщиком = новый SimpleDateFormat ("EEE , dd MMM yyyy HH: mm: ss Z ");

Как я узнаю об этом? Прочитайте documentation here.

Затем после того, как я разобрал его, я получаю свидание. что дата я ставлю в getRelativeTimeSpanString (без каких-либо дополнительных параметров отлично от меня, чтобы быть по умолчанию минут)

вы получите исключение если вы не выяснить правильного разбора строки, что-то вроде : исключение у персонажа 5. Посмотрите на символ 5 и исправьте начальную строку синтаксического анализа.. Вы можете получить другое исключение, повторите эти шаги, пока не получите правильную формулу.

1

Основываясь на кучу ответов здесь, я создал следующее для моего варианта использования.

Пример использования:

String relativeDate = String.valueOf(
       TimeUtils.getRelativeTime(1000L * myTimeInMillis())); 

import java.util.Arrays; 
import java.util.List; 

import static java.util.concurrent.TimeUnit.DAYS; 
import static java.util.concurrent.TimeUnit.HOURS; 
import static java.util.concurrent.TimeUnit.MINUTES; 
import static java.util.concurrent.TimeUnit.SECONDS; 

/** 
* Utilities for dealing with dates and times 
*/ 
public class TimeUtils { 

    public static final List<Long> times = Arrays.asList(
     DAYS.toMillis(365), 
     DAYS.toMillis(30), 
     DAYS.toMillis(7), 
     DAYS.toMillis(1), 
     HOURS.toMillis(1), 
     MINUTES.toMillis(1), 
     SECONDS.toMillis(1) 
    ); 

    public static final List<String> timesString = Arrays.asList(
     "yr", "mo", "wk", "day", "hr", "min", "sec" 
    ); 

    /** 
    * Get relative time ago for date 
    * 
    * NOTE: 
    * if (duration > WEEK_IN_MILLIS) getRelativeTimeSpanString prints the date. 
    * 
    * ALT: 
    * return getRelativeTimeSpanString(date, now, SECOND_IN_MILLIS, FORMAT_ABBREV_RELATIVE); 
    * 
    * @param date String.valueOf(TimeUtils.getRelativeTime(1000L * Date/Time in Millis) 
    * @return relative time 
    */ 
    public static CharSequence getRelativeTime(final long date) { 
     return toDuration(Math.abs(System.currentTimeMillis() - date)); 
    } 

    private static String toDuration(long duration) { 
     StringBuilder sb = new StringBuilder(); 
     for(int i=0;i< times.size(); i++) { 
      Long current = times.get(i); 
      long temp = duration/current; 
      if (temp > 0) { 
       sb.append(temp) 
        .append(" ") 
        .append(timesString.get(i)) 
        .append(temp > 1 ? "s" : "") 
        .append(" ago"); 
       break; 
      } 
     } 
     return sb.toString().isEmpty() ? "now" : sb.toString(); 
    } 
} 
0

это работает для меня

public class TimeDifference { 
    int years; 
    int months; 
    int days; 
    int hours; 
    int minutes; 
    int seconds; 
    String differenceString; 

    public TimeDifference(@NonNull Date curdate, @NonNull Date olddate) { 

     float diff = curdate.getTime() - olddate.getTime(); 
     if (diff >= 0) { 
      int yearDiff = Math.round((diff/(AppConstant.aLong * AppConstant.aFloat)) >= 1 ? (diff/(AppConstant.aLong * AppConstant.aFloat)) : 0); 
      if (yearDiff > 0) { 
       years = yearDiff; 
       setDifferenceString(years + (years == 1 ? " year" : " years") + " ago"); 
      } else { 
       int monthDiff = Math.round((diff/AppConstant.aFloat) >= 1 ? (diff/AppConstant.aFloat) : 0); 
       if (monthDiff > 0) { 
        if (monthDiff > AppConstant.ELEVEN) { 
         monthDiff = AppConstant.ELEVEN; 
        } 
        months = monthDiff; 
        setDifferenceString(months + (months == 1 ? " month" : " months") + " ago"); 
       } else { 
        int dayDiff = Math.round((diff/(AppConstant.bFloat)) >= 1 ? (diff/(AppConstant.bFloat)) : 0); 
        if (dayDiff > 0) { 
         days = dayDiff; 
         if (days == AppConstant.THIRTY) { 
          days = AppConstant.TWENTYNINE; 
         } 
         setDifferenceString(days + (days == 1 ? " day" : " days") + " ago"); 
        } else { 
         int hourDiff = Math.round((diff/(AppConstant.cFloat)) >= 1 ? (diff/(AppConstant.cFloat)) : 0); 
         if (hourDiff > 0) { 
          hours = hourDiff; 
          setDifferenceString(hours + (hours == 1 ? " hour" : " hours") + " ago"); 
         } else { 
          int minuteDiff = Math.round((diff/(AppConstant.dFloat)) >= 1 ? (diff/(AppConstant.dFloat)) : 0); 
          if (minuteDiff > 0) { 
           minutes = minuteDiff; 
           setDifferenceString(minutes + (minutes == 1 ? " minute" : " minutes") + " ago"); 
          } else { 
           int secondDiff = Math.round((diff/(AppConstant.eFloat)) >= 1 ? (diff/(AppConstant.eFloat)) : 0); 
           if (secondDiff > 0) { 
            seconds = secondDiff; 
           } else { 
            seconds = 1; 
           } 
           setDifferenceString(seconds + (seconds == 1 ? " second" : " seconds") + " ago"); 
          } 
         } 
        } 

       } 
      } 

     } else { 
      setDifferenceString("Just now"); 
     } 

    } 

    public String getDifferenceString() { 
     return differenceString; 
    } 

    public void setDifferenceString(String differenceString) { 
     this.differenceString = differenceString; 
    } 

    public int getYears() { 
     return years; 
    } 

    public void setYears(int years) { 
     this.years = years; 
    } 

    public int getMonths() { 
     return months; 
    } 

    public void setMonths(int months) { 
     this.months = months; 
    } 

    public int getDays() { 
     return days; 
    } 

    public void setDays(int days) { 
     this.days = days; 
    } 

    public int getHours() { 
     return hours; 
    } 

    public void setHours(int hours) { 
     this.hours = hours; 
    } 

    public int getMinutes() { 
     return minutes; 
    } 

    public void setMinutes(int minutes) { 
     this.minutes = minutes; 
    } 

    public int getSeconds() { 
     return seconds; 
    } 

    public void setSeconds(int seconds) { 
     this.seconds = seconds; 
    } } 
0

Это очень простой сценарий. его легко импровизировать.
Результат: (XXX часов назад) или (XX дней назад/Вчера/Сегодня)

<span id='hourpost'></span> 
,or 
<span id='daypost'></span> 

<script> 
var postTime = new Date('2017/6/9 00:01'); 
var now = new Date(); 
var difference = now.getTime() - postTime.getTime(); 
var minutes = Math.round(difference/60000); 
var hours = Math.round(minutes/60); 
var days = Math.round(hours/24); 

var result; 
if (days < 1) { 
result = "Today"; 
} else if (days < 2) { 
result = "Yesterday"; 
} else { 
result = days + " Days ago"; 
} 

document.getElementById("hourpost").innerHTML = hours + "Hours Ago" ; 
document.getElementById("daypost").innerHTML = result ; 
</script> 
1

Это лучший код, если мы рассмотрим performance.It уменьшает количество вычислений. Причина Протокол рассчитываются только, если количество секунд больше, чем 60 и часы рассчитываются только, если количество минут больше, чем 60 и так далее ...

class timeAgo { 

static String getTimeAgo(long time_ago) { 
    time_ago=time_ago/1000; 
    long cur_time = (Calendar.getInstance().getTimeInMillis())/1000 ; 
    long time_elapsed = cur_time - time_ago; 
    long seconds = time_elapsed; 
    // Seconds 
    if (seconds <= 60) { 
     return "Just now"; 
    } 
    //Minutes 
    else{ 
     int minutes = Math.round(time_elapsed/60); 

     if (minutes <= 60) { 
      if (minutes == 1) { 
       return "a minute ago"; 
      } else { 
       return minutes + " minutes ago"; 
      } 
     } 
     //Hours 
     else { 
      int hours = Math.round(time_elapsed/3600); 
      if (hours <= 24) { 
       if (hours == 1) { 
        return "An hour ago"; 
       } else { 
        return hours + " hrs ago"; 
       } 
      } 
      //Days 
      else { 
       int days = Math.round(time_elapsed/86400); 
       if (days <= 7) { 
        if (days == 1) { 
         return "Yesterday"; 
        } else { 
         return days + " days ago"; 
        } 
       } 
       //Weeks 
       else { 
        int weeks = Math.round(time_elapsed/604800); 
        if (weeks <= 4.3) { 
         if (weeks == 1) { 
          return "A week ago"; 
         } else { 
          return weeks + " weeks ago"; 
         } 
        } 
        //Months 
        else { 
         int months = Math.round(time_elapsed/2600640); 
         if (months <= 12) { 
          if (months == 1) { 
           return "A month ago"; 
          } else { 
           return months + " months ago"; 
          } 
         } 
         //Years 
         else { 
          int years = Math.round(time_elapsed/31207680); 
          if (years == 1) { 
           return "One year ago"; 
          } else { 
           return years + " years ago"; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

} 

}