Даты в 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>&nbsp;</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>&nbsp;</td>";
}
$text_cal.="</tr>\n";
$text_cal.="</table>";

echo
$text_cal;
?>

Ссылки с других сайтов

Пока ничего нет
Tags:

Комментарии:

Re: Даты в PHP

Изврат какой-то. Есть же замечательная функция 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

А как определить с помощью этой функции определить количество дней между 20 сентября 1986 года и 5 мая 2000-го?

Мне формат JDC показался предпочтительней.

mktime

Точно так же!
$date1 = mktime (0,0,0,9,20,1986);
$date2 = mktime (0,0,0,5,5,2000);
$diff = ($date2-$date1)/(3600*24);

Re: Даты в PHP

Действительно.
Похоже я кое-что упустил в своём самообразовании. Надо будет наверстывать. :)

Re: Даты в PHP

А ме не понятно следующее: каким образом можно получить прошлый месяц?
пример:
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

Для прошлого месяца (часа, года, дня) буквально вчера наткнулся на простое решение:

<?php
// Предыдущий месяц
echo date('Y-m-d',strtotime('-1 month'));
// Предыдущий год
echo date('Y-m-d',strtotime('-1 year'));
?>

Re: Даты в PHP

ответ следующий

<?php
$lastmonth
=date("Y-m-d", mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
print_r($lastmonth);
?>

удачи

Re: Даты в PHP

Подскажите, пожалуйста, с помощью какой функции сделать так, чтобы у пользователя сайта в любом регионе выводилось (ну или просто заносилось в переменную) время строго одного региона (например, московское время)?

Re: Даты в PHP

Не очень понятен вопрос.
Если имеется в виду, что нужно знать местное время пользователя зашедшего на страницу, то получить можно двумя способами:

  1. Средствами JavaScript - можно использовать объект Date(), примерно так:
    data=new Date();
    H=data.getHours();
    M=data.getMinutes();
  2. Средствами PHP это сделать затруднительно. По ip-адресу пользователя определить регион сложно. Нормального решения, насколько мне известно, нет.

Re: Даты в PHP

Да нет, наоборот, чтобы у пользователя хоть в Калининграде, хоть в Магадане на сайте показывало время московское. Но я уже, кажется, разобрался сам. Просто я сам не понимал сути. Всё оказалось, как я понял, на много проще. Функция date() и так выводит время того региона, где находится мой сервер, и если он в Москве, значит и будет всегда выводиться на сайте время московское. А я почему то думал, что эта функция выводит то время, которое установлено у пользователя на компьютере. Меня смутил в этом вопросе локальный сервер на моём компе, который выдавал мне всегда время местное. Вот я и смутился. но теперь кажется всё прояснилось. Надеюсь сейчас я всё правильно понял?
К сожалению, когда начинаешь, сталкиваешься и с такими казалось бы глупыми вопросами, решения на которые очень просты.

Re: Даты в PHP

Да верно. Функция date() выводит время сервера.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><h2><h3><img><p><b><img>
  • Строки и параграфы переносятся автоматически.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Each email address will be obfuscated in a human readable fashion or (if JavaScript is enabled) replaced with a spamproof clickable link.

Подробнее о форматировании

3 + 2 =
Вычислите и введите результат. Для вопроса "2+3" ответом будет "5".
Синдикация материалов