[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прибавить к дате месяц.
Dimka
К дате date("d-m-y"); нужно прибавить один месяц с учетом количества дней в месяце. Допустим, сегодня 31-01-09 нужно прибавить месяц и получить 28-02-09.

Подскажите как это сделать?
Поискал сам, нашел только как прибавить, но без учета количества дней в месяце, т.е. прибавить 30 дней.



Спустя 51 минута, 52 секунды (12.09.2009 - 12:58) jetistyum написал(а):
если к 31 прибавить месяц.... то не уверен что получится 28..
а если к 30 прибавить месяц, какое будет?
а к 29-му?

Спустя 22 минуты (12.09.2009 - 13:20) Dimka написал(а):
Нужно прибавлять календарный месяц.
Если к 31 января прибавить месяц, то получиться должно 28 февраля (т.к. в феврале 28 дней).

если вот так:
PHP
date("d-m-Y",mktime(0,0,0,date("m")+1,date("d"),date("Y"));

то прибавляя к 31 января 1 месяц, получаем 03 марта.

Прибавляя к 4 марта месяц получаем 4 апреля. Тут все нормально. Вот последние числа месяца не попадают. Можно ли это как-то сделать, как нам надо?

Спустя 40 минут, 28 секунд (12.09.2009 - 14:00) glock18 написал(а):
может
PHP
strtotime("+1 month");


Спустя 37 минут, 41 секунда (12.09.2009 - 14:38) Dimka написал(а):
Цитата (glock18 @ 12.09.2009 - 11:00)
может
PHP
strtotime("+1 month");

Тоже саме вместо 28 февраля получается 3 марта.
Видимо придется использовать так как есть. Может есть еще у кого-нибудь какие мысли?

Спустя 17 минут, 22 секунды (12.09.2009 - 14:55) Гость_hara написал(а):
как это использовать так как есть, всегда можно сделать вручную)

ну то есть просто берёте месяц, прибавляете к нему единицу если уже не 12
затем собираете дату и проверяете корректна ли она при помощи функции
checkdate если нет то уменьшаете день до тех пор пока не будет корректна

не так уж и сложно.

Спустя 34 минуты, 2 секунды (12.09.2009 - 15:29) Гость_hara написал(а):
ну вот почему то не лень было:
PHP
function dateAfterMonth($m=1,$d=1,$y=1970)
{
    if($m == 12){
        return strtotime("+1 month",mktime(0,0,0,$m,$d,$y));
    }

    ++$m;
    while(true){
        if(checkdate($m,$d,$y)){
           break;
        }
        --$d;
    }
    return mktime(0,0,0,$m,$d,$y);
}

проверка:
PHP
print 'in: 31 December 1970<br>';
print 'out: '.strftime('%d %B %Y',dateAfterMonth(12,31,1970)).'<br><br>';

print 'in: 30 January  2007<br>';
print 'out: '.strftime('%d %B %Y',dateAfterMonth(1,30,2007)).'<br><br>';

print 'in: 31 January 1988<br>';
print 'out: '.strftime('%d %B %Y',dateAfterMonth(1,31,1988)).'<br>';

на выходе:
PHP
in: 31 December 1970
out
: 31 January 1971

in
: 30 January 2007
out
: 28 February 2007

in
: 31 January 1988
out
:

как то так, 1988 высокосный...

Спустя 1 минута, 5 секунд (12.09.2009 - 15:30) Гость_hara написал(а):
потерялся кусочек проверки
in: 31 January 1988
out: 29 February 1988

Спустя 43 минуты, 29 секунд (12.09.2009 - 16:14) Guest написал(а):
Гость_hara, благодарю.

Спустя 19 часов, 42 минуты, 30 секунд (13.09.2009 - 11:56) jetistyum написал(а):
что-то я всеравно логики не понимаю.
прибавляем месяц к 28 янв, получаем 28 февр
к 29 - всеравно 28
к 30 - опять 28
к 31 - снова 28 февраля.
а фактически 3 дня разницы.
как-то это странно получается,

Спустя 1 час, 24 минуты, 31 секунда (13.09.2009 - 13:21) Гость_hara написал(а):
Ну да так и есть в итоге.

А логики? ну допустим платные услуги на месяц, раз так и обманули дня на три, -
а почему бы и нет? ))
месяц как бы другой, и что поделать что в нём нет такого числа как в этом))

хотя хотелось бы узнать для чего это нужно на самом деле)

Спустя 1 год, 5 месяцев, 5 дней, 4 часа, 59 минут, 4 секунды (18.02.2011 - 19:20) Шифу написал(а):
Ну вы пи%. В таком случае проще сплитануть слово на числа, как 14/11/2001 и тупо заменять второе и третье число без календарных потерь

Спустя 4 часа, 20 минут, 39 секунд (18.02.2011 - 23:41) Snus написал(а):
Месяц может быть 28, 30, 31... дней. Сделай условность, что месяц, допустим 30 дней и прибавляй к дате через strtotime();

Спустя 16 часов, 35 минут, 25 секунд (19.02.2011 - 16:16) YVSIK написал(а):
а по моему это гораздо проще
вот у мен так работает и ровно месяц
и ни дня боле и ни дня мене
<?php print (date("Y:m:d",time()+ 30*24*60*60));?>

а принт это или эхо всёж равно
можно и эхо

Спустя 8 месяцев, 9 часов, 52 минуты, 33 секунды (20.10.2011 - 01:09) Гость_Владимир написал(а):
Я написал вот такую функцию по прибавление определенного количества месяцев к дате:
function add_month_to_date($date, $m){	
if (is_numeric($m)){
while ($m>0){
$date += cal_days_in_month(CAL_GREGORIAN, strftime("%m",$date), strftime("%G",$date))*24*60*60;
$m--;
}
}

return $date;
}

Считает количество дней в каждом конкретном месяце и прибавляет

Спустя 6 месяцев, 29 дней, 10 часов, 6 минут, 56 секунд (19.05.2012 - 11:16) metra52 написал(а):
Гость_Владимир такой вопрос, а в каком формате должна быть переменная $date

Спустя 17 минут, 38 секунд (19.05.2012 - 11:33) Invis1ble написал(а):
metra52
ты на дату его коммента посмотри сначала
$date в его примере это timestamp

Спустя 3 минуты, 43 секунды (19.05.2012 - 11:37) metra52 написал(а):
Просто мне нужна такая функция, и то что предлагает он у меня не прокатывает... тоесть мне допустим к этой дате 2012-05-19 нужно прибавить ровно месяц с учетом колличества дней в месяце

Спустя 6 минут, 19 секунд (19.05.2012 - 11:43) Invis1ble написал(а):
echo date('Y-m-d', strtotime('2012-05-19 +1 month'));

Спустя 5 минут, 51 секунда (19.05.2012 - 11:49) metra52 написал(а):
а если нужная дата забита в БД как ее вставить в эту функцию, что бы к ней прибавлялось оплаченное колличество месяцев

Спустя 2 минуты, 3 секунды (19.05.2012 - 11:51) Invis1ble написал(а):
из твоего вопроса ничего непонятно, создай отдельный топик и там сформулируй четко задачу

Спустя 2 месяца, 6 дней, 17 часов, 1 минута, 34 секунды (26.07.2012 - 04:53) шип написал(а):
2 YVSIK
не работает. К 01.08.2012 ни хрена месяц не прибавляет - принтит, мол, 31.08.2012.
рази это месяц? Это всего лишь 30 дней, а 30 дней далеко не всегда месяц...

Спустя 3 дня, 13 часов, 56 минут, 29 секунд (29.07.2012 - 18:49) YVSIK написал(а):
шип
Ты сюда зачем забрел?
чтоб просто потролить? может ??? да?

так вот ФУНКЦИЯ date() определяет именно дату и при сложении чисел будет выдавать именно согласно календаря и не арифметических ваших выкладок
как пример: если сегодня 28 февраля и прибавить 30 то получится конечно 28 марта ну на то ты и программист чтоб решить этот вопрос, а не наоборот,
тебе и решать как ты это будешь решать.

можете это решить при помощи условий несовпадений , думаю что подобных условий будет не так и много(месяцев в году вего двенадцать biggrin.gif ), и что с того так и будем к этому претензии выдавать?
Наверно надо решить что нужно тебе а не тролить по любому поводу, и ещё хорошенько изучить эту функцию date()
ну возможно ещё выбрать некое среднее арифметическое, что то-же не очень и будет критично и мало кто вас в этом будет упрекать такова система счислений дней в календаре !!!

Спустя 2 минуты (29.07.2012 - 18:51) Игорь_Vasinsky написал(а):
Цитата
при помощи условий несовпадений

в PHP 6 появились?

Спустя 2 дня, 11 часов, 43 минуты, 16 секунд (1.08.2012 - 06:34) шип написал(а):
2 YVSIK
Ну отчего же. Например, в Oracle
SELECT ADD_MONTHS(to_date('30.01.2010','dd.mm.yyyy'), 1) FROM DUAL
вернет дату ’28.02.2010’
, а
SELECT ADD_MONTHS(to_date('30.01.2012','dd.mm.yyyy'), 1) FROM DUAL
вернет дату ’29.02.2012’

там посчитали нужным использование такой функции, а в php, видимо, нет. Как впрочем и типа даты... В ккакой там версии опомнились, в 5 или 6... в виде конструктора?

А так то написать ручками все можно - и двенадцать месяцев учитывать и високосные года. И разные там средние и не средние, месяцы-черезмесяцы...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.