Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: дата типа 1995-00-00 - как сделать метку времени?
 
 автор: elenaki   (02.05.2008 в 11:37)   письмо автору
 
 

mktime() не делает. а мы не знаем ни дня ни месяца! как занести только год?

   
 
 автор: Atheist   (02.05.2008 в 11:53)   письмо автору
 
   для: elenaki   (02.05.2008 в 11:37)
 

> mktime() не делает
Делает вообще-то.

<?php
echo date('Y'mktime(000111995)); // 1995
?>


> дата типа 1995-00-00
Она такая в базе?

> как занести только год?
Хм...Так unix timestamp или год?

   
 
 автор: elenaki   (02.05.2008 в 12:01)   письмо автору
 
   для: Atheist   (02.05.2008 в 11:53)
 

есть такой скриптик. я им всегда даты проверяю.
<?
function date_to_timestamp ($date)
{
$split_date split ('-'$date);
$timestamp mktime ($split_date[3], $split_date[4], $split_date[5], $split_date[1], $split_date[2], $split_date[0]);
return 
$timestamp;
}

function 
timestamp_to_date ($timestamp)
{
$date date ("d/m/Y - H:i:s" $timestamp);
return 
$date;
}

function 
form_dati ()
{
?>
<table>
<tr>
<td width="50%">&nbsp;
</td>
<td width="50%">
<form method="post" action="unixdate.php">
Convert form Normal to Unix <input checked type="radio" name="modo" value="unix"><br>
<input type="text" class="color" name="giorno" size="10" maxlength="2"> &nbsp; Day (dd)<br>
<input type="text" class="color" name="mese" size="10" maxlength="2"> &nbsp; Month (mm)<br>
<input type="text" class="color" name="anno" size="10" maxlength="4"> &nbsp; Year (yyyy)<br>
<input type="text" class="color" name="ora" size="10" maxlength="2"> &nbsp; Hour (24)<br>
<input type="text" class="color" name="min" size="10" maxlength="2"> &nbsp; Minutes<br>
<input type="text" class="color" name="sec" size="10" maxlength="2"> &nbsp; Seconds<br><br>
Convert from Unix to Normal <input type="radio" name="modo" value="normale"><br>
<input type="text" class="color" name="unixmode" size="10"> &nbsp; Unix Date<br><br>
<center><input type="submit" class="color" value="Submit"></center>
</form>
</td>
</tr>
</table>
<br><br>
<?
}
?>
<html>
<head>
<title>Unix date Converter</title>
</head>
<style>
input.color  {
        background-color: #99CCFF;
        font-family: arial;
        font-size: 11px;
        color: #000000;
        border: 1 solid #000000;
        height: 18px;        
}
</style>
<body text="black" bgcolor="white">
<center><h1>Unix Date Converter</h1></center><p>&nbsp;</p>
<?

echo mktime(000111995); 

if (
$_POST["modo"] == "")
{
form_dati();
}
if (
$_POST["modo"] == "unix")
{
form_dati();
$date $_POST["anno"]."-".$_POST["mese"]."-".$_POST["giorno"]."-".$_POST["ora"]."-".$_POST["min"]."-".$_POST["sec"];
$timestamp date_to_timestamp($date);
echo 
"<center><b>$date Unix date: $timestamp</b></center>";
$modo "";
}
if (
$_POST["modo"] == "normale")
{
form_dati();
$date timestamp_to_date($_POST["unixmode"]);
echo 
"<center><b>$unixmode, Normal date: $date</b> (dd/mm/yyyy - hh:mm) </center>";
$modo "";
}
?>


он выдает это. 788911200, Normal date: 01/01/1995 - 00:00:00 (dd/mm/yyyy - hh:mm)
а надо БЕЗ дня и месяца, они неизвестны...

наверно, придется держать в разных полях года, месяцы и дни.

   
 
 автор: Trianon   (02.05.2008 в 14:27)   письмо автору
 
   для: elenaki   (02.05.2008 в 12:01)
 

>он выдает это. 788911200, Normal date: 01/01/1995 - 00:00:00 (dd/mm/yyyy - hh:mm)
>а надо БЕЗ дня и месяца, они неизвестны...

timestamp - линейное представление времени.

За моментом 31/12/1994 - 23:59:59 сразу же без пропусков следует момент 01/01/1995 - 00:00:00
первый представляет собой 788911199-ю секунду (считая для от известного момента для Вашей зоны)
второй - соответственно - 788911200-ю секунду.
Момента 00/00/1995 физически не существует ( и не существовало) - значит и значения timestamp такого быть не может.

>наверно, придется держать в разных полях года, месяцы и дни.
Можно так.
Вы можете также пожертвовать одну из секунд года для такой цели,
определив что, к примеру, 01/01/XXXX - 00:00:00 будет означать не первую секунду года ХХХХ, а любой неопределенный момент в году ХХХХ.

   
 
 автор: Atheist   (02.05.2008 в 14:37)   письмо автору
 
   для: elenaki   (02.05.2008 в 12:01)
 

> split
Тут лучше применять explode

> а надо БЕЗ дня и месяца

Заменить
> $date = timestamp_to_date($_POST["unixmode"]);
На
> $date = date('Y', $_POST["unixmode"]);

   
 
 автор: elenaki   (02.05.2008 в 18:03)   письмо автору
 
   для: Atheist   (02.05.2008 в 14:37)
 

это не мой скрипт, я им пользуюсь только но локальном компе и менять ничего В НЕМ не собираюсь.

   
 
 автор: Atheist   (02.05.2008 в 22:39)   письмо автору
 
   для: elenaki   (02.05.2008 в 18:03)
 

Извиняюсь, неправильно понял, конечно. Меня всё-таки смутил скрипт - не понял к чему он тут.

Нужно чтобы если указывался год, то и показывать только год при выводе "нормальной" даты? Тогда да, оптимальный выход только в разделении даты на несколько полей. Причем, если в поле, например, "00" - то это неизвестная компонента даты (месяц или день).
Либо если пользоваться советом Trianon'а и если я правильно его понял, то нужно еще добавить поле, в котором будет указываться что известно. В данном случае - год. Например, это поле может принимать такие значения: известен год - 0, месяц - 1, день - 2. По этим трём значениям можно однозначно определить формат даты, так как случаи вроде "известен год и день, но неизвестен месяц" - бессмысленны.

P.S.
> менять ничего В НЕМ не собираюсь
> echo mktime(0, 0, 0, 1, 1, 1995); // Это явно внесенное изменение :)

   
 
 автор: Trianon   (02.05.2008 в 23:30)   письмо автору
 
   для: Atheist   (02.05.2008 в 22:39)
 

>...нужно еще добавить поле, в котором будет указываться что известно.
>В данном случае - год. Например, это поле может принимать такие значения:
>известен год - 0, месяц - 1, день - 2.
>По этим трём значениям можно однозначно определить формат даты, так как
>случаи вроде "известен год и день, но неизвестен месяц" - бессмысленны.

Это уже третий способ решить проблему. Но он, как и тот, что предложила elenaki, требует внесения изменений в схему БД, хотя и не таких кардинальных.

То, что предложил я, может оказаться полезным, когда по условиям вносить изменения в таблицы нельзя вообще. Если допустить, что в первую секунду года события возникать не могут (либо могут быть без вреда переписаны на вторую секунду (т.е. на XXXX-01-01 00:00:01), то можно внести изменения в скрипт , чтоб тот такие значения как XXXX-01-01 00:00:00 представлял как ситуацию "известен только год".

Конечно, совсем не корректируя скрипты, изменить логику работы не получится :)

   
 
 автор: elenaki   (03.05.2008 в 15:27)   письмо автору
 
   для: Atheist   (02.05.2008 в 22:39)
 

Это явно внесенное изменение - нужно же было как-то получить метку, чтобы вставить ее в поле. и на работу скрипта этот вывод никак не влияет.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования