![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Как найти разницу в месяцах между двумя датами заданных в unix TIMESTAMP? Если разница меньше одного месяца, то должно вывестись что-то типа 0.5, т.е. пол месяца.
Надо,чтобы функция корректно обрабатывала кол-во дней в месяцев и высокосные года. Добавлено @ 15:28 Думаю реализация может быть такая:
Добавлено @ 15:29 Но тут будет вычеслена только разница, если она равна хотя бы 1 месяцу. |
|||
|
||||
| rMaveric |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 18.7.2003 Репутация: 3 Всего: 6 |
Думаю должно так работать Это просто вывод числовых значений разницы месяцев и дней, также моэжно добавить лет если необходимо А если нужно вывести только месяцы то
Это сообщение отредактировал(а) rMaveric - 30.1.2005, 15:43 -------------------- |
||||
|
|||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Мы ведь не можем делить на 30, т.к. тогда потеряем точностьв наших расчетах. Дней может быть и 31 и 28 и 29. |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
Admin
mktime, когда посчитаешь результат пропустишь его через date() для получения YYY=MM-DD |
|||
|
||||
| rMaveric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 18.7.2003 Репутация: 3 Всего: 6 |
В таком случае нам достаточно разделить на кол-вл месяцев в году и получим
Не... это не подойдет наверно.. т.к. здесь он бред выдаст... в зависимости от обеих дат... Но можно вставить вместа параметра $delta метку Юникса, на большую дату, тогда будет боелее логично, но я бы оставил деление на 30, т.к. какое из значений ставить месяца начала или месяца конца??? А у них в большинстве случаев будут разные кол-ва дней в году. А среднее значение... 365/12 = 30,4 Это сообщение отредактировал(а) rMaveric - 30.1.2005, 17:04 -------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
Можно сразу вычисления сделаь в mktime, она автоматом все переведет.. Это сообщение отредактировал(а) Mal Hack - 30.1.2005, 17:08 |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Mal Hack В этом примере получим мы секунды, а не месяцы. Секундны модно конвертировать в дни, а дни в месяцы нельзя. т.к. месяцы содержат разное кол-во дней.
|
|||
|
||||
| rMaveric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 18.7.2003 Репутация: 3 Всего: 6 |
2 Admin
Пожалуйста объясни что это должно быть... т.к. не понятна такая критичная скорость... Т.к. я не могу представить как вообще можно вычислить точный процент... -------------------- |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Это должны быть месяцы. Все просто. У меня в базе заложена цена какой-то услуги за 1 месяц.
Клиент может заказать услугу с 23 января по 1 января следующего года. Как вычислить теперь, сколько он должен заплатить? |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Не нашел пока ничего лучшего, кроме как прохода по всем месяцам, на которые заказана услуга и добавления номеров этих месяцев в массив. Чтобы затем через date получить кол-во дней в месяце по его ИД. Затем складываем все это и получаем кол-во дней на которые заказана услуга(согласно данным по месяцам).
Далее вычитаем из общего кол-ва дней, на которые заказана услуга(это мы можем получить совершенно точно) - кол-во дней, которые мы сейчас вычислили "по месяцам". В результате мы имеем: - кол-во месяцев, на которые была заказана услуга - Остаток в днях - знаем, сколько дней в конкретном месяце
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Итак. Испробовал я несколько алгоритмов. Один сложнее другого
Итак, решение: 1. Вычисляем разницу в полных месяцах между датами заказа услуги 2. Полученное кол-во месяцев прибавляем к дата начала заказа и находим теперь уже разницу в днях между этой датой и датой окончания заказа. 3. Если разница в днях =0, то $total_price=$price*$month; иначе $total_price=$price*month+$price/30.4167*разница в днях; Есть только один недостаток, который мне так и не удалось избежать. Это точность цены за один день. Для ее определения я делю цену за месяц на 30.4167(365/12) Интересно, насколько это критично для финансовой программы и как можно добиться бОльшей точности. Ведь мы используем не календарные месяцы, а свои, например, с 15 января по 15 февраля. |
|||
|
||||
| tigrik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.9.2004 Репутация: 1 Всего: 3 |
Мы делали похожую систему. Вот код на Си.
На ПХП переделать легко. Единственно, что необходимо добавить - функция DecodeDate, которая разобьёт TDateTime на год-месяц-день.
Это сообщение отредактировал(а) tigrik - 31.1.2005, 15:05 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 5 Всего: 454 |
Во-первых, ты этот расчет никогда не протащишь через налоговую - тебя сожрут. Во-вторых, у тебя тарифы устанавливаются как? небось на январь - такой, на февраль - сякой... то есть может платеж за месяц одинаковый, но стоимость дня из-за разного количества дней получится разная (даже если новый тариф вводится посередь месяца - это ни трудностей не вызовет, ни изменений в алгоритме не потребует) - вот и считай сколь в данном промежутке времени у тебя было январских дней с январской ценой, и сколь соответственно февральских, потом множь-складывай... соответственно по отчетам ты можешь всегда и детальный расчет выдать, в т.ч. на любую промежуточную дату, и ни одна ***цензура** к твоему алгоритму не прикопается... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Т.е. это совершенно нормально, что стоимость одного дня в разный месяцах разная?
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
это не нормально.
а почему просто не использовать 1/28, 1/29, 1/30, 1/31 например, полмесяца в феврале: 14/28=0,5 полмесяца в апреле: 15/30=0,5 если месяц переходящий (с 15 февраля по 15 марта) то тогда 14/28+15/31 погрешность конечно будет, но не большая ну и в чём проблема -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |