@game_score
, определенная там, называется переменной экземпляра класса, которая является переменной, определенной для объекта singleton class:
class << Bowling
attr_accessor :game_score
end
Bowling.game_score #=> 0
Это как вы можете отличить от обычных переменных экземпляра, определенных для примера объекты.
Поскольку все кричат «ЙУДАА !!!» но никто не публикует конкретный пример, вот мой вклад.
Вы также можете сделать это с помощью 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
(Кашель, старый, кашель)
Календарь класс может обработать большую часть связанной с датой математики. Необходимо будет получить результат compareTo и произвести формат сами все же. Нет стандартной библиотеки, которая делает точно, что Вы ищете, хотя могла бы быть сторонняя библиотека, которая делает.
Хорошо, после резюме просматривают API, кажется, что Вы могли сделать следующее: -
HTH
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" : ""));
Если Ваши промежутки пересекают переход на летнее время (летний период) границы, Вы хотите сообщить о количестве дней?
, Например, 23:00 к 23:00 на следующий день является всегда днем, но может быть 23, 24 или 25 часов в зависимости от того, пересекают ли Вы переход перехода на летнее время.
, Если Вы заботитесь об этом, удостоверьтесь, что Вы включаете его в свой выбор.
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).
Я всегда запускаю с Время Joda . Работа с датами и временем в Java всегда является "забавным" но Временем Joda, снимает деформацию.
у Них есть классы Интервала и Продолжительности, которые делают половину того, что Вы ищете. Не уверенный, если у них есть функция для вывода в читаемом формате все же. Я буду продолжать смотреть.
HTH
Я не эксперт в Java, но можно сделать t1-t2=t3 (в секундах), тогда делят это на 60, дал бы Вам, минуты, на еще 60 дадут Вам секунды. Тогда это - просто вопрос выяснения, в каком количестве подразделений Вы нуждаетесь.
Hope это помогает.
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. В основном он пытается сделать временной интервал более дружественным, но есть несколько ограничений, например, он будет вести себя странно, если время (параметр) находится в будущем, и он ограничен только днями, часами и секундами (месяцы и годы не обрабатываются, так что кто-то еще может ;-).
примеры вывода:
, ура :D
EDIT: теперь поддерживает месяцы и годы :P