Verfasst: 30.04.2007 19:49
@ jan500
na dann filter mal an hand des timestamps wer alles am 01.01. geburtstag hat
gruß
na dann filter mal an hand des timestamps wer alles am 01.01. geburtstag hat

gruß
phpBB.de - Die deutsche phpBB-Community
https://www.phpbb.de/community/
Ich hatte schon gedacht es liegt an der Datenbank (INT -> BIGINT), aber mktime() und date() produzieren leider keine korrekten Timestamps mehr.Anmerkung: Der gültige Bereich eines Timestamp liegt typischerweise zwischen Fri, 13 Dec 1901 20:45:54 GMT und Tue, 19 Jan 2038 03:14:07 GMT. (Das entspricht den minimalen und maximalen Werten für einen vorzeichenbehafteten 32-Bit Integer). Unter Windows-Betriebssytemen ist dieser Bereich auf 01-01-1970 bis 19-01-2038 beschränkt.
Code: Alles auswählen
<?php
// resultiert -14462 bei PHP4
echo(mktime(0, 0, 0, 1, 1, 1900));
?>
Code: Alles auswählen
<?php
function mk_time($hour=0, $min=0, $sec=0, $mon=0, $day=0, $year=0)
{
/*
if ( $year > 1901 && $year < 2038 )
{
return mktime($hour, $min, $sec, $mon, $day, $year);
}
*/
// add one day for a leap year
$leap = 0;
if ( ($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0 )
{
$leap = 1;
}
$month = array(
0 => 0,
1 => 31,
2 => 59 + $leap,
3 => 90 + $leap,
4 => 120 + $leap,
5 => 151 + $leap,
6 => 181 + $leap,
7 => 212 + $leap,
8 => 243 + $leap,
9 => 273 + $leap,
10 => 304 + $leap,
11 => 334 + $leap
);
// leap years
$leap = 0;
if ( $year != 1970 )
{
if ( $year > 1970 )
{
for ($i = $year - 1; 1970 < $i; $i--)
{
if ( ($i % 4 == 0 && $i % 100 != 0) || $i % 400 == 0 )
{
$leap++;
}
}
// dst
if ( $year >= 1980 && $year <= 1990 && $mon >= 3 && $mon <= 9 )
{
$ymdhms = sprintf('%04d%02d%02d%02d%02d%02d', $year, $mon, $day, $hour, $min, $sec);
if ( $ymdhms >= 19800406025959 && $ymdhms <= 19800928015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19810329025959 && $ymdhms <= 19810927015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19820328025959 && $ymdhms <= 19820926015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19830327025959 && $ymdhms <= 19830925015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19840325025959 && $ymdhms <= 19840930015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19850331025959 && $ymdhms <= 19850929015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19860330025959 && $ymdhms <= 19860928015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19870329025959 && $ymdhms <= 19870927015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19880327025959 && $ymdhms <= 19880925015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19890326025959 && $ymdhms <= 19890924015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19900325025959 && $ymdhms <= 19900930015959 )
{
$hour = $hour - 1;
}
}
else if ( $year >= 1991 && $mon >= 3 && $mon <= 10 )
{
$ymdhms = sprintf('%04d%02d%02d%02d%02d%02d', $year, $mon, $day, $hour, $min, $sec);
if ( $ymdhms >= (($year * 10000000000) + 325025959) && $ymdhms <= (($year * 10000000000) + 1029015959) )
{
$hour = $hour - 1;
}
}
}
else
{
for ($i = $year; $i < 1969; $i++)
{
if ( ($i % 4 == 0 && $i % 100 != 0) || $i % 400 == 0 )
{
$leap--;
}
}
// dst
if ( $year >= 1916 && $year <= 1918 && $mon >= 4 && $mon <= 9 )
{
$ymdhms = sprintf('%04d%02d%02d%02d%02d%02d', $year, $mon, $day, $hour, $min, $sec);
if ( $ymdhms >= 19160430235959 && $ymdhms <= 19160930235959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19170416025959 && $ymdhms <= 19170917015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19180415025959 && $ymdhms <= 19180916015959 )
{
$hour = $hour - 1;
}
}
else if ( $year >= 1940 && $year <= 1942 )
{
$ymdhms = sprintf('%04d%02d%02d%02d%02d%02d', $year, $mon, $day, $hour, $min, $sec);
if ( $ymdhms >= 19400401025959 && $ymdhms <= 19421102015959 )
{
$hour = $hour - 1;
}
}
else if ( $year >= 1943 && $year <= 1949 && $mon >= 3 && $mon <= 11 )
{
$ymdhms = sprintf('%04d%02d%02d%02d%02d%02d', $year, $mon, $day, $hour, $min, $sec);
if ( $ymdhms >= 19430329025959 && $ymdhms <= 19431004015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19440403025959 && $ymdhms <= 19441002015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19450402025959 && $ymdhms <= 19451118015959 )
{
$hour = $hour - 1;
if ( $ymdhms >= 19450530235959 && $ymdhms <= 19450922235959 )
{
$hour = $hour - 1;
}
}
else if ( $ymdhms >= 19460414025959 && $ymdhms <= 19461007015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19470406025959 && $ymdhms <= 19471005015959 )
{
$hour = $hour - 1;
if ( $ymdhms >= 19470510235959 && $ymdhms <= 19470628235959 )
{
$hour = $hour - 1;
}
}
else if ( $ymdhms >= 19480418025959 && $ymdhms <= 19481003015959 )
{
$hour = $hour - 1;
}
else if ( $ymdhms >= 19490410025959 && $ymdhms <= 19491002015959 )
{
$hour = $hour - 1;
}
}
}
}
return (($hour - 1) * 3600) + (($min) * 60) + $sec + (($month[ $mon - 1 ] + $day - 1 + $leap) * 86400) + (($year - 1970) * 31536000);
}
for ($i = 0; $i <= 100; $i++)
{
$hour = rand(0, 23);
$min = rand(0, 59);
$sec = rand(0, 59);
$mon = rand(1, 12);
$day = rand(1, 31);
$year = rand(1800, 2200);
$mk_time = mk_time($hour, $min, $sec, $mon, $day, $year);
$mktime = mktime($hour, $min, $sec, $mon, $day, $year);
$diff = $mktime - $mk_time;
if ( $diff < 100000 && $diff > -100000 && $mk_time != $mktime )
{
echo('<b>Falsch!</b><br />');
echo('mk_time: ' . $mk_time . '<br />');
echo('mktime: ' . $mktime . '<br />');
echo('Differenz: ' . $diff . '<br />');
echo('Stunden: ' . $hour . '<br />');
echo('Minuten: ' . $min . '<br />');
echo('Sekunden: ' . $sec . '<br />');
echo('Monate: ' . $mon . '<br />');
echo('Tage: ' . $day . '<br />');
echo('Jahre: ' . $year . '<br /><br />');
}
}
?>
Wenn du ein DATE-Feld verwenden würdest, dürfte das doch kein Problem sein. Ich verstehe irgendwie nicht ganz, warum du den Geburtstag unbedingt doppelt speichern willst, wenn es doch auch einfach geht (bzw. man die entsprechenden Werte sowieso aus den anderen berechnen kann, egal bei welcher Lösung). Auch ist es bei der Speicherung von Geburtstagen doch wirklich sinnlos, das ganze in Sekunden vor/nach 1.1.1970 abzuspeichern, oder?mgutt hat geschrieben:Na dann bleibe ich doch glatt mal bei den vier Feldern. Wer weiß, vielleicht will ich irgendwann mal wissen, wer alles im August 2000 Geburtstag hat
Bisher brauche ich dazu aber nur:Der Typ DATE erlaubt die Benutzung eines Datums ohne Zeitangabe. MySQL ruft DATE-Werte im Format 'YYYY-MM-DD' ab und zeigt sie auch so an. Der unterstützte Bereich liegt zwischen '1000-01-01' und '9999-12-31'.
Code: Alles auswählen
echo(date($format, $timestamp));
Code: Alles auswählen
UNIX_TIMESTAMP(datum) AS `timestamp`
Code: Alles auswählen
DATE_FORMAT(datum, $format) AS `formatiertes_datum`
Code: Alles auswählen
date($format, strtotime($datum));
Daher zurück auf meine Ausgangsfrage. Welche Variante wäre die schnellste bzw. wer sollte dann in Deinen Augen die Formatierung machen: MySQL oder PHP?yyyy-mm-dd
yyyymmdd
Code: Alles auswählen
YEAR(datum) AS `jahr`, MONTH(datum) AS `monat`, DAYOFMONTH(datum) AS `tag`
Code: Alles auswählen
SELECT id, name,
CONCAT( DATE_FORMAT( datum, '%e. ' ),
CASE DATE_FORMAT( datum, '%M' )
WHEN 'January'
THEN 'Januar'
WHEN 'February'
THEN 'Februar'
WHEN 'March'
THEN 'März'
WHEN 'April'
THEN 'April'
WHEN 'May'
THEN 'Mai'
WHEN 'June'
THEN 'Juni'
WHEN 'July'
THEN 'Juli'
WHEN 'August'
THEN 'August'
WHEN 'September'
THEN 'September'
WHEN 'October'
THEN 'Oktober'
WHEN 'November'
THEN 'November'
WHEN 'December'
THEN 'Dezember'
END , DATE_FORMAT( datum, ' %Y' ) ) AS formatiertes_datum
FROM personen
Code: Alles auswählen
SELECT id, name, DAYOFMONTH( datum ) AS tag, MONTHNAME( datum ) AS monat, YEAR( datum ) AS jahr
FROM personen
Code: Alles auswählen
$formatiertes_datum = $row['tag'] . '. ' . $lang['datetime'][ $row['monat'] ] . ' ' . $row['jahr'];