![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
arcsupport |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 24.10.2008 Репутация: 1 Всего: 2 |
Существуют ли стандартные (встроенные в JRE) классы, объекты и методы, которые позволят рассчитать количество лет, месяцев, недель и дней между двумя датами по грегорианскому календарю?
По юлианскому календарю? |
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Это как бы основа
А конкретный тип календаря определяется конкретным наследником java.util.Calendar. Например там есть GregorianCalendar. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
arcsupport |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 24.10.2008 Репутация: 1 Всего: 2 |
jk1, меня больше интересует не общее количество дней, а количество лет, месяцев, недель и дней между двумя датами.
|
|||
|
||||
Stolzen |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
arcsupport, можно примерно так
Оно? Добавлено через 5 минут и 2 секунды Года не добавлял, т.к. они могут быть високосные и невисокосные. Если это не важно, то в массив MILILIS можно добавить на первое место еще одну константу MILLIS_PER_YEAR = 355 * MILLIS_PER_DAY; и в MessageFormat.format("{0} days, {1} hours, {2} minutes", res); добавить {0} years |
||||
|
|||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Не надо изобретать велосипедов. Класс TimeUnit, о котором я говорил выше, умеет выполнять преобразования единиц времени. В данном случае это будут преобразования милисекунд в минуты, часы, дни. -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
Преобразование он делать умеет, а вот делить с остатком - нет
|
|||
|
||||
jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Умеет
дает в результате 1 -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
Stolzen |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1041 Регистрация: 17.10.2005 Репутация: 23 Всего: 48 |
А остаток?
|
|||
|
||||
jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Вуаля
-------------------- Opinions are like assholes — everybody has one |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
По моему умудренные советчики не поняли вопроса. Вопрос в исчислении стажа того или иного вида. То есть следует указать сколько лет, месяцев и дней прошло от одной даты до другой.
Нельзя говорить 100 дней, нужно сказать три месяца и ? дней. С этого момента начинаются неприятности при подсчете стажей, поскольку разные месяцы содержат разное число дней. Далее вопрос о том, какая точность нужна. Ниже пример для грубого подсчета без делений, а средствами стандартных библиотек. Еще ниже (по тексту) пример точного подсчета. Текст не оптимизирован. Если задача регулярная, то стоит написать отдельную функцию и почистить код.
пример вывода 1257 вариант jk1 - просто число дней. 11 days 5 month 3 years грубый расчет. 9 days 5 month 3 years точный расчет Забавно, но куда-то потерялось два дня. Я думал что разность будет в один день. -------------------- Mirkes |
|||
|
||||
arcsupport |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 24.10.2008 Репутация: 1 Всего: 2 |
Mirkes, спасибо.
|
|||
|
||||
Dummy |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
Mirkes, в вашей реализации я вижу пару моментов, с которыми хочется поспорить.
На моей машине и с моим самопальным тестом (не претендующим на особую прецизионность), скорость вычисления увеличивается раза в полтора-два. Это сообщение отредактировал(а) Dummy - 10.1.2012, 22:12 |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Есть подозрение, что вот этот фрагмент внесет погрешность. К сожалению пора на работу и нет времени проверить. Как только буду готов - напишу.
По поводу эффективности алгоритмов - я уже написал, что алгоритм не оптимизирован. Успел набросать на основе метода Dummy свой метод.
Нужно провести тест для проверки возникновения различий. Разница точно возникла, но мое время истекло. Вернусь - проверю что правильно. -------------------- Mirkes |
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Принял экзамен, теперь можно сдавать экзамен на владение датами.
В ходе ряда экспериментов установил, что пользоваться функцией TimeUnit.DAYS.convert для вычисления числа дней надо предельно акуратно, поскольку она имеет дурную привычку учитывать переоз на зимнее/летнее время, даже если его не было. Или перевод времени можно отключить? Сравнение FastDiff Dummy, и моего stag в следующей редакции:
Сравнение производилось следующим способом. Начальная дата выбиралась и задавалась вручную. В качестве конечной даты рассматривались все даты начиная с 11.01.2012 в течении 370 дней - чуть больше года. Все совпало при дате начала 01.08.2008. Различия установлены в следующих случаях: стартовая дата 02.08.2008 отличия в случаях (плюс по одному случаю совпадения) Дата конца FastDiff Dummy Мой stag 29.02.2012 27 days 6 month 3 years 27 days 6 month 3 years 01.03.2012 30 days 6 month 3 years 28 days 6 month 3 years 02.03.2012 0 days 7 month 3 years 0 days 7 month 3 years 30.04.2012 28 days 8 month 3 years 28 days 8 month 3 years 01.05.2012 30 days 8 month 3 years 29 days 8 month 3 years 02.05.2012 0 days 9 month 3 years 0 days 9 month 3 years Дальше видимо можно не продолжать. Вопрос о том, что есть правильно, конечно спорный, но вывод моего метода мне гораздо приятней. Если это нужно, то описание расчетов разницы дат можно добавить в статью по работе с датами в Java в FAQ -------------------- Mirkes |
|||
|
||||
Dummy |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 21.5.2007 Репутация: 9 Всего: 19 |
И в изначальном варианте не мог быть оптимизирован. Кроме того, выдавал отрицательное количество месяцев на некоторых данных.
Cогласен ![]() |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |