Как я могу рассчитать промежуток времени в Java и отформатировать вывод?

@game_score, определенная там, называется переменной экземпляра класса, которая является переменной, определенной для объекта singleton class:

class << Bowling
  attr_accessor :game_score
end

Bowling.game_score #=> 0

Это как вы можете отличить от обычных переменных экземпляра, определенных для примера объекты.

42
задан Jeremy Logan 6 May 2009 в 06:16
поделиться

10 ответов

Поскольку все кричат ​​«ЙУДАА !!!» но никто не публикует конкретный пример, вот мой вклад.

Вы также можете сделать это с помощью Joda-Time . Используйте Period для представления периода. Чтобы отформатировать период в желаемом человеческом представлении, используйте PeriodFormatter , который вы можете построить с помощью PeriodFormatterBuilder .

Вот начальный пример:

DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .appendYears().appendSuffix(" year, ", " years, ")
    .appendMonths().appendSuffix(" month, ", " months, ")
    .appendWeeks().appendSuffix(" week, ", " weeks, ")
    .appendDays().appendSuffix(" day, ", " days, ")
    .appendHours().appendSuffix(" hour, ", " hours, ")
    .appendMinutes().appendSuffix(" minute, ", " minutes, ")
    .appendSeconds().appendSuffix(" second", " seconds")
    .printZeroNever()
    .toFormatter();

String elapsed = formatter.print(period);
System.out.println(elapsed + " ago");

Гораздо яснее и лаконичнее, не так ли?

Это отпечатки к настоящему времени

32 years, 1 month, 1 week, 5 days, 6 hours, 56 minutes, 24 seconds ago

(Кашель, старый, кашель)

68
ответ дан 26 November 2019 в 23:17
поделиться

Календарь класс может обработать большую часть связанной с датой математики. Необходимо будет получить результат compareTo и произвести формат сами все же. Нет стандартной библиотеки, которая делает точно, что Вы ищете, хотя могла бы быть сторонняя библиотека, которая делает.

0
ответ дан Ben S 6 May 2009 в 17:16
поделиться
  • 1
    Как Python способствует функциональному программированию? Функции лямбды являются решительно второразрядными гражданами, и все изменяемо по умолчанию. Даже Guido соглашается, что Python не является большой частью функционального языка: python-history.blogspot.com/2009/04/… – Chuck 18 February 2010 в 21:44

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

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

HTH

0
ответ дан mr_urf 6 May 2009 в 17:16
поделиться
  • 1
    Я должен сказать, I' ve, замеченный эта работа прежде, но it' s не работающий на меня сегодня. ' Label' поле isn' t доступный в выпадающем, несмотря на них включаемый в списке.: ( – Paul Russell 5 April 2013 в 09:43

Я рекомендовал бы взглянуть на HumanTime

12
ответ дан Peter Lindholm 6 May 2009 в 17:16
поделиться
  • 1
    Спасибо за немного более ясную схему Erwin' s инструкции, но в будущем можно рассмотреть использование " edit" кнопка на его ответе вместо того, чтобы отправить Ваше собственное. Хорошо сделанный при предоставлении кредита все же.:) – Chiramisu 24 February 2014 в 19:22
    Date start = new Date(1167627600000L); // JANUARY_1_2007
    Date end = new Date(1175400000000L); // APRIL_1_2007


    long diffInSeconds = (end.getTime() - start.getTime()) / 1000;

    long diff[] = new long[] { 0, 0, 0, 0 };
    /* sec */diff[3] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);
    /* min */diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;
    /* hours */diff[1] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;
    /* days */diff[0] = (diffInSeconds = (diffInSeconds / 24));

    System.out.println(String.format(
        "%d day%s, %d hour%s, %d minute%s, %d second%s ago",
        diff[0],
        diff[0] > 1 ? "s" : "",
        diff[1],
        diff[1] > 1 ? "s" : "",
        diff[2],
        diff[2] > 1 ? "s" : "",
        diff[3],
        diff[3] > 1 ? "s" : ""));
45
ответ дан Timour 6 May 2009 в 17:16
поделиться
  • 1
    Вы помните то, что разделяет, который был в? Это интересно. – rlbond 7 June 2010 в 21:46

Если Ваши промежутки пересекают переход на летнее время (летний период) границы, Вы хотите сообщить о количестве дней?

, Например, 23:00 к 23:00 на следующий день является всегда днем, но может быть 23, 24 или 25 часов в зависимости от того, пересекают ли Вы переход перехода на летнее время.

, Если Вы заботитесь об этом, удостоверьтесь, что Вы включаете его в свой выбор.

1
ответ дан Adrian Pronk 6 May 2009 в 17:16
поделиться
  • 1
    @JulianKnight Является там новым способом сделать это в более поздних версиях SharePoint/Office тогда? Кроме того, я был неудачен, чтобы заставить версию SharePoint обнаруживаться на наших листах Excel, какие-либо подсказки там? Информация видима в " Файл > Информация > Управляйте Version" таким образом, это должно быть возможно нет? – Geert 28 February 2014 в 09:56
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. Можно найти больше деталей об этом в спецификация API Java (java.sun.com).

-2
ответ дан Timo 6 May 2009 в 17:16
поделиться
  • 1
    Возможно, это было представлено Вам тот путь, но исторически это было разработано независимо (и я думаю ранее). Я согласовываю в некотором интуитивном смысле их взгляд более подобный, чем любой делает к C, и схема перевода короче в одном случае, чем другой. Но я don' t думают there' s что-либо больше к нему, чем это. I' m, не говоря there' s никакое эффективное различие между чем-либо, I' m говорящий, почему должен " режим transportation" будьте определены с точки зрения " моделирует car" когда существуют также лодки. – dubiousjim 18 February 2010 в 21:11

Я всегда запускаю с Время Joda . Работа с датами и временем в Java всегда является "забавным" но Временем Joda, снимает деформацию.

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

HTH

0
ответ дан mr_urf 6 May 2009 в 17:16
поделиться

Я не эксперт в Java, но можно сделать t1-t2=t3 (в секундах), тогда делят это на 60, дал бы Вам, минуты, на еще 60 дадут Вам секунды. Тогда это - просто вопрос выяснения, в каком количестве подразделений Вы нуждаетесь.

Hope это помогает.

1
ответ дан TuxMeister 6 May 2009 в 17:16
поделиться
  • 1
    @Geert: нет все еще никакого собственного способа сделать это! Существует дополнение для SharePoint, который работает путем поддержания поля отдельной версии. It' s свободный и назван Шоу Версия SharePoint в Office Документы . It' s лучшее решение I' с ve сталкиваются. Это должно работать с Excel также, но I' ve, который не попробовали это. I' ve никакая идея, почему MS don' t представляют поле версии правильно - it' s безумный. – Julian Knight 5 March 2014 в 08:45

Yup awakened the dead I have, but here's my improved implementation based on @mtim posted code, as this thread comes almost on top of the searches so I am messing with the sleepy hollow,

    public static String getFriendlyTime(Date dateTime) {
    StringBuffer sb = new StringBuffer();
    Date current = Calendar.getInstance().getTime();
    long diffInSeconds = (current.getTime() - dateTime.getTime()) / 1000;

    /*long diff[] = new long[]{0, 0, 0, 0};
    /* sec *  diff[3] = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);
    /* min *  diff[2] = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;
    /* hours *  diff[1] = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;
    /* days * diff[0] = (diffInSeconds = (diffInSeconds / 24));
     */
    long sec = (diffInSeconds >= 60 ? diffInSeconds % 60 : diffInSeconds);
    long min = (diffInSeconds = (diffInSeconds / 60)) >= 60 ? diffInSeconds % 60 : diffInSeconds;
    long hrs = (diffInSeconds = (diffInSeconds / 60)) >= 24 ? diffInSeconds % 24 : diffInSeconds;
    long days = (diffInSeconds = (diffInSeconds / 24)) >= 30 ? diffInSeconds % 30 : diffInSeconds;
    long months = (diffInSeconds = (diffInSeconds / 30)) >= 12 ? diffInSeconds % 12 : diffInSeconds;
    long years = (diffInSeconds = (diffInSeconds / 12));

    if (years > 0) {
        if (years == 1) {
            sb.append("a year");
        } else {
            sb.append(years + " years");
        }
        if (years <= 6 && months > 0) {
            if (months == 1) {
                sb.append(" and a month");
            } else {
                sb.append(" and " + months + " months");
            }
        }
    } else if (months > 0) {
        if (months == 1) {
            sb.append("a month");
        } else {
            sb.append(months + " months");
        }
        if (months <= 6 && days > 0) {
            if (days == 1) {
                sb.append(" and a day");
            } else {
                sb.append(" and " + days + " days");
            }
        }
    } else if (days > 0) {
        if (days == 1) {
            sb.append("a day");
        } else {
            sb.append(days + " days");
        }
        if (days <= 3 && hrs > 0) {
            if (hrs == 1) {
                sb.append(" and an hour");
            } else {
                sb.append(" and " + hrs + " hours");
            }
        }
    } else if (hrs > 0) {
        if (hrs == 1) {
            sb.append("an hour");
        } else {
            sb.append(hrs + " hours");
        }
        if (min > 1) {
            sb.append(" and " + min + " minutes");
        }
    } else if (min > 0) {
        if (min == 1) {
            sb.append("a minute");
        } else {
            sb.append(min + " minutes");
        }
        if (sec > 1) {
            sb.append(" and " + sec + " seconds");
        }
    } else {
        if (sec <= 1) {
            sb.append("about a second");
        } else {
            sb.append("about " + sec + " seconds");
        }
    }

    sb.append(" ago");


    /*String result = new String(String.format(
    "%d day%s, %d hour%s, %d minute%s, %d second%s ago",
    diff[0],
    diff[0] > 1 ? "s" : "",
    diff[1],
    diff[1] > 1 ? "s" : "",
    diff[2],
    diff[2] > 1 ? "s" : "",
    diff[3],
    diff[3] > 1 ? "s" : ""));*/
    return sb.toString();
}

It obviously can be improved. В основном он пытается сделать временной интервал более дружественным, но есть несколько ограничений, например, он будет вести себя странно, если время (параметр) находится в будущем, и он ограничен только днями, часами и секундами (месяцы и годы не обрабатываются, так что кто-то еще может ;-).

примеры вывода:

  • около секунды назад
  • 8 минут и 34 секунды назад
  • час и 4 минуты назад
  • день назад
  • 29 дней назад
  • год и 3 месяца назад

, ура :D

EDIT: теперь поддерживает месяцы и годы :P

18
ответ дан 26 November 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: