Даты в PHP
С датами в PHP мне работать уже конечно приходилось. Обычно дело сводилось к тому, чтобы получить текущие дату-время и сделать с ними, что-нибудь несложное: вывести на экран, записать в БД или файл и пр. Для этих целей мне хватало функции date(), которую использовал примерно в следующем виде:
<?php
echo "Текущее время: ".date('d.m.Y H:m:s');
?>Сегодня понадобилось определять количество дней между двумя датами и в книге Котерова и Костарева я обнаружил такую вещь как дата в формате JDC.
На практике оказалось все очень просто и удобно: берете три числа - день, месяц, год. С помощью функции GregorianToJD($month,$day,$year) преобразуете в формат JDC, который на деле оказывается еще одним числом. Чтобы узнать, дату которая будет через 10 дней, достаточно к дате в этом формате добавить 10 и затем преобразовать получившуюся дату в строку с помощью функции JDToGregorian($jd)
Правда потом еще приходится извлекать из этой строки данные - день, месяц и год разделены слэшами. Непонятно, почему не сделали чтобы функция возвращала массив: первый элемент - год, второй - месяц, третий - день.
Чтобы не мучиться с explode() каждый раз, быстренько соорудил такую вспомогательную функцию:
<?php
function JDToArray($jdc){
return explode('/',JDToGregorian($jdc));
}
?>Еще одна полезная функция: checkdate($m,$d,$y) - определяет существует ли заданный день в григорианском календаре. В качестве параметров требует номер месяца, дня и года. Именно в таком порядке. Позволяет без проблем отловить ошибку, если в скрипте случайно оказался 13-й месяц или такая уникальная дата как 30 февраля.
Ну и наконец - JDDayOfWeek($d). Функция по получает дату в формате JDC и возвращает номер дня недели: 0 - воскресенье, 1 - понедельник и т.д. Вообще-то ее возможности побольше (позволяет возвращать названия дней недели на английском языке), но мне показалось, что того что есть достаточно. Скрипты делать мне приходится делать для русскоязычных пользователей. Все эти функции вместе позволяют не утруждая себя размышлениями получить календарь на текущий месяц. У меня получилось следующее:
<?php
$day=date('d');
$mon=date('m');
$year=date('Y');
function JDToArray($jdc){
return explode('/',JDToGregorian($jdc));
}
$jdc=GregorianToJD($mon,1,$year);
$mon_next=$mon+1;
if($mon_next>12){$mon_next=1;$year2=$year+1;}else{$year2=$year;};
$jdc2=GregorianToJD($mon_next,1,$year2);
$text_cal="<table border=1>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс</td></tr>
<tr>";
$w=JDDayOfWeek($jdc);
$w-=1;
if($w==-1){$w=5;};
for($i=0;$i<$w;$i++){
$text_cal.="<td> </td>";
}
for($i=$jdc;$i<$jdc2;$i++){
$w=JDDayOfWeek($i);
$data=JDToArray($i);
$text_cal.="<td>$data[1]</td>";
if($w==0){
$text_cal.="</tr>\n<tr>";
}
}
$w-=1;
if($w==-1){$w=5;};
for($i=$w;$i<6;$i++){
$text_cal.="<td> </td>";
}
$text_cal.="</tr>\n";
$text_cal.="</table>";
echo $text_cal;
?>
Комментарии:
Re: Даты в PHP
Опубликовано Славянск-на-Кубани (не проверено) в Вс, 11/01/2009 - 14:36.Изврат какой-то. Есть же замечательная функция mktime() :).
Например:
$tomorrow = mktime (0,0,0,date("m") ,date("d")+1,date("Y"));
$lastmonth = mktime (0,0,0,date("m")-1,date("d"), date("Y"));
$nextyear = mktime (0,0,0,date("m"), date("d"), date("Y")+1);
Re: Даты в PHP
Опубликовано vikeng в Втр, 13/01/2009 - 23:47.А как определить с помощью этой функции определить количество дней между 20 сентября 1986 года и 5 мая 2000-го?
Мне формат JDC показался предпочтительней.
mktime
Опубликовано Bolzamo (не проверено) в Сб, 14/03/2009 - 08:31.Точно так же!
$date1 = mktime (0,0,0,9,20,1986);
$date2 = mktime (0,0,0,5,5,2000);
$diff = ($date2-$date1)/(3600*24);
Re: Даты в PHP
Опубликовано vikeng в Сб, 14/03/2009 - 23:50.Действительно.
Похоже я кое-что упустил в своём самообразовании. Надо будет наверстывать. :)
Re: Даты в PHP
Опубликовано dmitry66667 (не проверено) в Чт, 21/01/2010 - 13:14.А ме не понятно следующее: каким образом можно получить прошлый месяц?
пример:
function LastMonth() {
$year = date("Y");
$month = date("m")-1;
$day = date("d");
$lstm = $starty."-".$startm."-".$startd;
return $lstm;
}
если дата, например, 2010-05-10 функция вернет результат 2010-04-10, а если так 2010-01-10 то результат будет следующим: 2010-0-10
как быть? если дата нужна именно в формате YYYY-mm-dd?
Re: Даты в PHP
Опубликовано vikeng в Чт, 28/01/2010 - 15:37.Для прошлого месяца (часа, года, дня) буквально вчера наткнулся на простое решение:
<?php// Предыдущий месяц
echo date('Y-m-d',strtotime('-1 month'));
// Предыдущий год
echo date('Y-m-d',strtotime('-1 year'));
?>
Re: Даты в PHP
Опубликовано dmitry66667 (не проверено) в Чт, 21/01/2010 - 13:27.ответ следующий
<?php$lastmonth=date("Y-m-d", mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
print_r($lastmonth);
?>
удачи
Re: Даты в PHP
Опубликовано yura (не проверено) в Ср, 27/01/2010 - 15:10.Подскажите, пожалуйста, с помощью какой функции сделать так, чтобы у пользователя сайта в любом регионе выводилось (ну или просто заносилось в переменную) время строго одного региона (например, московское время)?
Re: Даты в PHP
Опубликовано vikeng в Чт, 28/01/2010 - 15:29.Не очень понятен вопрос.
Если имеется в виду, что нужно знать местное время пользователя зашедшего на страницу, то получить можно двумя способами:
data=new Date();H=data.getHours();
M=data.getMinutes();
Re: Даты в PHP
Опубликовано yura (не проверено) в Чт, 28/01/2010 - 16:47.Да нет, наоборот, чтобы у пользователя хоть в Калининграде, хоть в Магадане на сайте показывало время московское. Но я уже, кажется, разобрался сам. Просто я сам не понимал сути. Всё оказалось, как я понял, на много проще. Функция date() и так выводит время того региона, где находится мой сервер, и если он в Москве, значит и будет всегда выводиться на сайте время московское. А я почему то думал, что эта функция выводит то время, которое установлено у пользователя на компьютере. Меня смутил в этом вопросе локальный сервер на моём компе, который выдавал мне всегда время местное. Вот я и смутился. но теперь кажется всё прояснилось. Надеюсь сейчас я всё правильно понял?
К сожалению, когда начинаешь, сталкиваешься и с такими казалось бы глупыми вопросами, решения на которые очень просты.
Re: Даты в PHP
Опубликовано vikeng в Чт, 28/01/2010 - 20:02.Да верно. Функция date() выводит время сервера.
Отправить комментарий