HTML logoPHP logoMySQL logo   HTML PHP MySQL Dato/tid




Datoer og tidspunkter indtager en særlig plads blandt data idet de i forskellige situationer kan have forskellige formater - og alligevel skal kunne bruges til sortering.


Datoer og tid optræder både internt HTML, PHP og MySQL og skal kunne transporteres på tværs: typisk fra HTML (Form | Input) til PHP og videre til MySQL - eller den modsatte vej.


Links:

  • PHP: Date funktionen: MySQL
  • PHP: strftime funktionen: MySQL
  • W3: MySQL DATE_FORMAT(): MySQL
  • MySQL: Dato- og tid- datatyper - oversigt: MySQL
  • MySQL: Dato- og tid- datatyper: MySQL
  • MySQL: Dato- og tid- funktioner i MySQL: MySQL. Anvendes til indsætning i SELECT-sætninger (i det omfang, de understøttes af PHP).




MySQL og Input type


MySQL og HTML (input type) er ikke helt enige om, hvilke datatyper relateret til dato og tid, der skal være til rådighed. For de 3 datatyper, der er enighed om er syntaksen det samme.


Der foregår (ult. 2014) i browserne en udvikling væk fra at dato / tid bliver håndteret i tekst-felter over i mod en javaScript understøttet "datepicker". I højre kolonne nedenfor kan det ses hvilken understøttelse den aktuelle browser tilbyder.


MySQLI form
TypeInput typeSyntaksDefault
afhængig af browser
DATEDATE'YYYY-MM-DD'
DATETIMEDATETIME-LOCAL'YYYY-MM-DD HH:MM:SS'
TIMETIME'HH:MM:SS' eller 'HHH:MM:SS'
YEAR'text'-felt / drop down.'YYYY'
TIMESTAMPEtableres med now() uden input.'YYYY-MM-DD HH:MM:SS'ikke relevant
findes ikkeDATETIME'YYYY-MM-DD HH:MM:SS'
findes ikkeMONTH'YYYY-MM'
findes ikkeWEEK'YYYY-Www'




Form


Input type-felter bør oprettes med deres respektive ident. (Det er gjort i oversigten ovenfor). Understøttes en input type ikke af den aktuelle browser viser den default et "text"-felt.




Select


Skal man ikke bruge hele datastrengen i et tabelfelt (DATE, DATETIME etc.) kan den relevante delstreng selekteres v.h.a. almindelig anvendelse af PHP-funktionen SUBSTR.


$query = "SELECT SUBSTR(xxx_dato,1,7)as ind_dato FROM tabelnavn


Ovenfor er trukket de førstre 7 karakterer (yyyy-mm).




Uddata


Oftest vil det være nødvendigt / hensigtsmæssigt at konvertere datoer (og tid) fra databaseformat til et mere læsevenligt format. Den enkelte konvertering bør foretages umiddelbart før dataene skal vises med 'echo'.


PHP kan tilsyneladende ikke (primo 2014) arbejde med datoer ældre end 14. december 1901. 13. december 1901 konverterer til 01.01.1970 (Unix nul-dato).


I koderne skal 'ind_dato' og '$ud_dato' tilpasses den aktuelle situation.


Y, n og d - samt koder for tid kan erstattes af andre bogstavkoder fra oversigten nedenfor.



Uden månedsnavne.


F.eks: 2014-02-26 => 26-02-2014


Datoer fra databasen kan tilpasses med

$dato = date("d-n-Y", strtotime($row['ny_dato']));


strtotime($row['ind_dato']) konverterer de hentede DB-data til sekunder siden 1. januar 1970.


date("Y-n-d") konverterer derefter sekunderne til læsbar tid baseret på PHP's "bogstavkoder" (se nedenfor) og valgfrie separatorer. I eksemplet er anvendt "-" som separator. Det betyder, at man frit kan vende og dreje og selektere i den hentede dato og tid efter behov



Med danske månedsnavne.


F.eks: 2014-02-26 => 26. Februar 2014


Der skal nu bruges en array med månedsnavnene og et lille stykke kode.


Array

$mdr = array(1 => "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");

eller

$mdr = array(1 => "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec");


Arrayen placeres før koden et sted på aktuel side. Den er modificeret fra standard til at have '1' som laveste værdi i stedet for '0'.


Kode

$dato = date("Y-n-d", strtotime($row['ind_dato']));
$arr = explode("-", $dato);
list($year, $month, $date) = $arr;
$ud_dato = $date . ". " . $mdr[$month] . " " . $year;
echo "<td>$ud_dato</td>";




Ugedage.


F.eks: 2014-01-03 => Fredag den 03. Januar 2014


Der skal nu bruges en array med ugedagenes navne og et lille stykke kode.


Array

$dage = array(1 => "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag");


Arrayen placeres før koden et sted på aktuel side. Den er modificeret fra standard til at have '1' som laveste værdi i stedet for '0'.


Kode

$dato = date("N-Y-n-d", strtotime($nyh_row['ind_dato']));
$arr = explode("-", $dato);
list($day, $year, $month, $date) = $arr;
$ud_dato = $dage[$day]. " den " . $date . ". " . $mdr[$month] . " " . $year;
echo $ud_dato . "<br />";




Måned år.


Måned og år (eller andre delmængder af datastrengen i tabellen) kan - efter select med SUBSTR - vises på denne måde:

$dato = date("Y-n", strtotime($row['ind_dato']));
$arr = explode("-", $dato);
list($year, $month) = $arr;
$ud_dato = $mdr[$month] . " " . $year;
echo $ud_dato;


Ved indlæggelse i en 'while'-løkke kan eksempelvis etableres en 'månedsoversigt', som den bl.a. kendes fra højre kolonne i Wordpress.




Tider.


F.eks: 2014-12-05 10:38:33 => Fredag den 05. December 2014 kl 10:38:33


Ved at tilpasse koden kan der også vises tider:


Kode

$dato = date("N-Y-n-d-G-i-s", strtotime($nyh_row['ind_dato']));
$arr = explode("-", $dato);
list($day, $year, $month, $date, $time, $minut, $sekunder) = $arr;
$ud_dato = $dage[$day]. " den " . $date . ". " . $mdr[$month] . " " . $year. " kl ". $time .":". $minut. ":" . $sekunder;




Tidsmetoder i MySQL


I SELECT-sætninger (WHERE ---) kan kan indsættes en lang række MySQL-funktioner til i situationen at tilpasse brugen af de enkelte lagrede datoer.


Fordelt ud over funktionerne kan der søges på følgende intervaller:


microsecondweeksecond_microsecondhour_minute
secondmonthminute_microsecondday_microsecond
minutequarterminute_secondday_second
houryearhour_microsecondday_minute
dayhour_secondDay_hour




PHP bogstavkoder.


Med de rette data til rådighed kan PHP via date-funktionen vise dem på et næsten utal af måder: x


Rundt omkring i verden er der mindst 6 måder at nummerere uger på. Ugens start- og slutdag varierer også:

ISO-8601 og i mange lande (bl.a. i Europa) går ugen fra mandag til søndag. I andre lande (bl.a. USA) regnes ugen fra søndag til lørdag.


ISO-8601 på Wikipedia (standarden kan ikke ses, men skal købes) x

RFC2822 x


DAG
dDato (2-cifrede)01-31
DUgedage som 3-cifret engelsk tekstMon -> Sun
jDato (1-2 cifret)1-31
lUgedage som fuld engelsk tekstSunday -> Saturday
LUgedage som fuld engelsk tekstsunday -> saturday
NUgedag angivet ved nummer (ISO-8601)1 (mandag) -> 7 (søndag)
SEngelsk ordenstalsendelse. Fungerer godt sammen med jst, nd, rd og th
wUgedag angivet ved nummer (ISO-8601)1 (søndag) -> 7 (lørdag)
zDag i året0 -> 365
UGE
WUgenummer i året. Starter mandag??
MÅNED
FMåned som fuld engelsk tekstJanuary -> December
mMåned (2-cifrede)01 -> 12
MMåned som 3-cifret engelsk tekstJan -> Dec
nMåned (1-2 cifrede)1 ->12
tAntal dage i en måned28 -> 31
ÅR
LIndikator for skudår1 -> skudår
0 -> andre år
oÅrstal iflg. ISO-8601. Svarer til Y bortset fra at årstallet følger ugenumrene i ISO-8601. 2014
YÅrstal2014
yÅrstal (2-cifret)14
TID
aam og pm (ante meridiem) og (post meridiem)am, pm
AAM og PMAM, PM
BSwatch internet tid x. Døgnet er delt op i 1000 enheder000 -> 999
g12-timers format (1-2 cifre)1 -> 12
G24-timers format (1-2 cifre)0 -> 23
h12-timers format (2-cifret)01 ->12
H24 timers format (2-cifret)00 -> 23
iMinutter (2-cifrede)00 -> 59
sSekunder (2-cifrede)00 -> 59
uMikrosekunder !!!!!654321
TIDSZONE
eIdent for tidszoneUTC, GMT, Atlantic/Azores etc.
IIdent for sommertid1 -> sommertid
0 -> vintertid
OForskel til UTC / GMT+0200
PForskel til UTC / GMT+02:00
TForkortelse for tidszonens betegnelseEST, MDT etc.
ZSekunders offset fra GMT / UTC+ øst for Greenwich
- vest for Greenwich
FULD DATO / TID-STRENG
cISO-8601 dato2015-03-12T17:05:44+00:00
rDato formatteret efter RFC2822Wed, 22 Dec 2000 16:01:07 +0200
USekunder siden 1. januar 1970. Se også time()




















x
x