![HTML logo](/felles/logoer/html5.png) ![PHP logo](/felles/logoer/php.png) 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](/felles/ikoner/rodfir.gif)
- PHP: strftime funktionen:
![MySQL](/felles/ikoner/rodfir.gif)
- W3: MySQL DATE_FORMAT():
![MySQL](/felles/ikoner/rodfir.gif)
- MySQL: Dato- og tid- datatyper - oversigt:
![MySQL](/felles/ikoner/rodfir.gif)
- MySQL: Dato- og tid- datatyper:
![MySQL](/felles/ikoner/rodfir.gif)
- MySQL: Dato- og tid- funktioner i 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.
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:
microsecond | week | second_microsecond | hour_minute |
second | month | minute_microsecond | day_microsecond |
minute | quarter | minute_second | day_second |
hour | year | hour_microsecond | day_minute |
day | | hour_second | Day_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](/felles/ikoner/rodfir.gif)
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](/felles/ikoner/rodfir.gif)
RFC2822 ![x](/felles/ikoner/rodfir.gif)
DAG |
d | Dato (2-cifrede) | 01-31 |
D | Ugedage som 3-cifret engelsk tekst | Mon -> Sun |
j | Dato (1-2 cifret) | 1-31 |
l | Ugedage som fuld engelsk tekst | Sunday -> Saturday |
L | Ugedage som fuld engelsk tekst | sunday -> saturday |
N | Ugedag angivet ved nummer (ISO-8601) | 1 (mandag) -> 7 (søndag) |
S | Engelsk ordenstalsendelse. Fungerer godt sammen med j | st, nd, rd og th |
w | Ugedag angivet ved nummer (ISO-8601) | 1 (søndag) -> 7 (lørdag) |
z | Dag i året | 0 -> 365 |
UGE |
W | Ugenummer i året. Starter mandag | ?? |
MÅNED |
F | Måned som fuld engelsk tekst | January -> December |
m | Måned (2-cifrede) | 01 -> 12 |
M | Måned som 3-cifret engelsk tekst | Jan -> Dec |
n | Måned (1-2 cifrede) | 1 ->12 |
t | Antal dage i en måned | 28 -> 31 |
ÅR |
L | Indikator for skudår | 1 -> 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 | Årstal | 2014 |
y | Årstal (2-cifret) | 14 |
TID |
a | am og pm (ante meridiem) og (post meridiem) | am, pm |
A | AM og PM | AM, PM |
B | Swatch internet tid . Døgnet er delt op i 1000 enheder | 000 -> 999 |
g | 12-timers format (1-2 cifre) | 1 -> 12 |
G | 24-timers format (1-2 cifre) | 0 -> 23 |
h | 12-timers format (2-cifret) | 01 ->12 |
H | 24 timers format (2-cifret) | 00 -> 23 |
i | Minutter (2-cifrede) | 00 -> 59 |
s | Sekunder (2-cifrede) | 00 -> 59 |
u | Mikrosekunder !!!!! | 654321 |
TIDSZONE |
e | Ident for tidszone | UTC, GMT, Atlantic/Azores etc. |
I | Ident for sommertid | 1 -> sommertid 0 -> vintertid |
O | Forskel til UTC / GMT | +0200 |
P | Forskel til UTC / GMT | +02:00 |
T | Forkortelse for tidszonens betegnelse | EST, MDT etc. |
Z | Sekunders offset fra GMT / UTC | + øst for Greenwich - vest for Greenwich |
FULD DATO / TID-STRENG |
c | ISO-8601 dato | 2015-03-12T17:05:44+00:00 |
r | Dato formatteret efter RFC2822 | Wed, 22 Dec 2000 16:01:07 +0200 |
U | Sekunder siden 1. januar 1970. Se også time() | |
|