Как я могу рассчитать промежуток времени в Java и отформатировать вывод? - PullRequest
40 голосов
/ 11 марта 2009

Я хочу взять два раза (в секундах с начала эпохи) и показать разницу между ними в следующих форматах:

  • 2 минуты
  • 1 час, 15 минут
  • 3 часа, 9 минут
  • 1 минуту назад
  • 1 час, 2 минуты назад

Как мне это сделать ??

Ответы [ 17 ]

0 голосов
/ 25 февраля 2017

Недавно я получил такое же требование, когда мне нужен базовый метод для печати продолжительности. У меня не было возможности использовать какую-либо стороннюю библиотеку. Поэтому я просто усовершенствовал идею @mtim.

public static void main(String[] args) throws IOException, ParseException {
        String since = "2017-02-24T04:44:05.601Z";
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        TimeZone utc = TimeZone.getTimeZone("UTC");
        dateFormat.setTimeZone(utc);

        Date sinceDate = dateFormat.parse(since);
        Date now = new Date();
        long durationInSeconds  = TimeUnit.MILLISECONDS.toSeconds(now.getTime() - sinceDate.getTime());

        long SECONDS_IN_A_MINUTE = 60;
        long MINUTES_IN_AN_HOUR = 60;
        long HOURS_IN_A_DAY = 24;
        long DAYS_IN_A_MONTH = 30;
        long MONTHS_IN_A_YEAR = 12;

        long sec = (durationInSeconds >= SECONDS_IN_A_MINUTE) ? durationInSeconds % SECONDS_IN_A_MINUTE : durationInSeconds;
        long min = (durationInSeconds /= SECONDS_IN_A_MINUTE) >= MINUTES_IN_AN_HOUR ? durationInSeconds%MINUTES_IN_AN_HOUR : durationInSeconds;
        long hrs = (durationInSeconds /= MINUTES_IN_AN_HOUR) >= HOURS_IN_A_DAY ? durationInSeconds % HOURS_IN_A_DAY : durationInSeconds;
        long days = (durationInSeconds /= HOURS_IN_A_DAY) >= DAYS_IN_A_MONTH ? durationInSeconds % DAYS_IN_A_MONTH : durationInSeconds;
        long months = (durationInSeconds /=DAYS_IN_A_MONTH) >= MONTHS_IN_A_YEAR ? durationInSeconds % MONTHS_IN_A_YEAR : durationInSeconds;
        long years = (durationInSeconds /= MONTHS_IN_A_YEAR);

        String duration = getDuration(sec,min,hrs,days,months,years);
        System.out.println(duration);
    }
    private static String getDuration(long secs, long mins, long hrs, long days, long months, long years) {
        StringBuffer sb = new StringBuffer();
        String EMPTY_STRING = "";
        sb.append(years > 0 ? years + (years > 1 ? " years " : " year "): EMPTY_STRING);
        sb.append(months > 0 ? months + (months > 1 ? " months " : " month "): EMPTY_STRING);
        sb.append(days > 0 ? days + (days > 1 ? " days " : " day "): EMPTY_STRING);
        sb.append(hrs > 0 ? hrs + (hrs > 1 ? " hours " : " hour "): EMPTY_STRING);
        sb.append(mins > 0 ? mins + (mins > 1 ? " mins " : " min "): EMPTY_STRING);
        sb.append(secs > 0 ? secs + (secs > 1 ? " secs " : " secs "): EMPTY_STRING);
        sb.append("ago");
        return sb.toString();
    }

Результатом будет интервал времени (продолжительность), напечатанный словами, например 1 day 2 hours 51 mins 41 secs ago

0 голосов
/ 26 августа 2016

Я думаю, что вы ищете что-то вроде PrettyTime
PrettyTime - это библиотека форматирования времени OpenSource. Полностью настраиваемый, он создает удобочитаемые для человека , относительные временные метки , подобные тем, которые можно увидеть на Digg, Twitter и Facebook. Доступно на более чем 30 языках! ссылка на сайт: https://github.com/ocpsoft/prettytime

Может использоваться и в Android

Например

System.out.println(p.format(new Date(System.currentTimeMillis() + 1000*60*10)));
        //prints: "10 minutes from now"
0 голосов
/ 05 февраля 2014

Форматирование промежутков времени в java часто всплывает в ETL или DB. Следующий фрагмент кода показывает, как я получаю импульс операции.

    SimpleDateFormat ymdhms=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    DecimalFormat formatter = new DecimalFormat("#,###"); /* ("#,###.00"); gives you the decimal fractions */
    int counter=0;
    Date beginTime0=new Date();
    while (<some end condition>) {

        <some time consuming operation>

        /*// uncomment this section durring initial exploration of the time consumer
        if(counter>100000){
            System.out.println("debug exiting due to counter="+counter);
            System.exit(0);
        }
        */

        if(0==counter%1000){
            Date now = new Date();
            long diffInSeconds = (now.getTime() - beginTime0.getTime()) / 1000;
            long diff[] = new long[] { 0, 0, 0, 0 };
            diff[3] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);                        /* sec   */ 
            diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds; /* min   */ 
            diff[1] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds; /* hours */ 
            diff[0] = (diffInSeconds = (diffInSeconds / 24));                                            /* days  */ 
            String delta = String.format(
                "%s%s%s%s"
                ,(diff[0]>0?String.format("%d day%s "    ,diff[0],(diff[0]!=1?"s":"")):"")
                ,(diff[1]>0?String.format("%2d hour%s "  ,diff[1],(diff[1]!=1?"s":" ")):"")
                ,(diff[2]>0?String.format("%2d minute%s ",diff[2],(diff[2]!=1?"s":" ")):"")
                ,           String.format("%2d second%s ",diff[3],(diff[3]!=1?"s":" "))
            );
            System.out.println(String.format(
                "%12s %s delta= %s"
                ,formatter.format(counter)
                ,ymdhms.format(new Date())
                ,delta
                )
            );
        }
        counter++;
    }
0 голосов
/ 03 сентября 2011

Решение "Abduliam Rehmanius" кажется довольно приятным, или вы можете использовать какую-то библиотеку выше, или вы можете создавать новые простые вещи, см. Решение JS здесь: http://www.datejs.com/. Нетрудно преобразовать в язык Java : -)

Надеюсь, моя ссылка вам пригодится!

0 голосов
/ 11 марта 2009
long time1, time2;
time1 = System.currentMillis();

.. drink coffee

time2 = System.currentMillis();

long difference = time2 - time1 // millies between time1 and time2

java.util.Date differneceDate = new Date(difference);

Чтобы создать строку типа «2 минуты», вы должны использовать DateFormatter / DateFormat. Вы можете найти более подробную информацию об этом в спецификации Java API (java.sun.com).

0 голосов
/ 11 марта 2009

Я всегда начинаю с Joda Time . Работа с датами и временем в Java всегда "забавна", но Joda Time снимает с себя нагрузку.

У них есть классы Interval и Duration, которые делают половину того, что вы ищете. Не уверен, что у них есть функция для вывода в удобочитаемом формате. Я буду продолжать искать.

НТН

0 голосов
/ 11 марта 2009

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

  1. создать несколько ReadableInstants, представляющих время начала и время окончания.
  2. Используйте Hours.hoursBetween, чтобы получить количество часов
  3. используйте Minutes.minutesBetween для получения количества минут
  4. используйте 60 минут для получения оставшихся минут
  5. и вуаля!

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...