Tid og dato

Diverse tid og dato eksempler i PHP.

Formatere datoer

date og DateTime bruker kun engelsk format. For å formatere i et annet språk, bruk datefmt_format (IntlDateFormatter).
strftime er deprecated siden PHP 8.1.

date/DateTime
echo date("d. F Y");

$date = new DateTime('2000-01-01');
echo $date->format('d. F Y H:i:s');
datefmt_format/IntlDateFormatter

Man må ha intl-modulen for å bruke denne funksjonen.

Dokumentasjon IntlDateFormatter
Formater for bruk i IntlDateFormatter
Formater for bruk i DateTime::createFromFormat

$fmt = new IntlDateFormatter('nb_NO');
$fmt->setTimeZone('Europe/Oslo');

$fmt->setPattern('eeee d LLLL yyyy kk:mm:ss');
echo $fmt->format(DateTime::createFromFormat('Y-m-d', '2022-04-13'));
echo $fmt->format(192345222);

$fmt->setPattern('LLLL');
echo $fmt->format(DateTime::createFromFormat('!m', '5'));
echo $fmt->format(new DateTime());

Jobbe med datoer

Beregn start og slutt dato med klokkeslett til bruk i SQL spørringer (datetime BETWEEN start AND end) med hensyn til utc/sommer/vintertid. Går ut ifra at dato er lagret i UTC tid, og server default er UTC.

public function getStartAndEnd($date_start, $date_end, $format_end = null, $week = null, $year = null)
{

    $tz_in = new DateTimeZone('Europe/Oslo');
    $tz_out = new DateTimeZone('UTC');

    if(!is_null($week) && !is_null($year)) {
        $date_start = new DateTime();
        $date_start->setISODate($year, $week);
    } else {
        $date_start = DateTime::createFromFormat('Y-m-d', $date_start);
    }

    $date_start->setTimezone($tz_in);
    $date_start->setTime(0, 0);
    $date_start->setTimezone($tz_out);

    $start = $date_start->format('Y-m-d H:i:00');

    // Uke
    if(!is_null($week) && !is_null($year)) {
        $date_start->add(new DateInterval('PT168H'));
        $end = $date_start->format('Y-m-d H:i:s');
    }
    else {
        $date_end = DateTime::createFromFormat('Y-m-d', $date_end);
        $date_end->setTimezone($tz_in);
        $date_end->setTime(23, 59);
        $date_end->setTimezone($tz_out);
        $end = $date_end->format('Y-m-' . (is_null($format_end) ? 'd' : $format_end) . ' H:i:s');
    }

    return [$start, $end];

}

var_dump(getStartAndEnd('2021-11-13', '2021-11-20'));
// output: { [0]=> string(19) "2021-11-12 23:00:00" [1]=> string(19) "2021-11-20 22:59:00" }

var_dump(getStartAndEnd('2022-03-01', '2021-03-31', 't'));
// output: { [0]=> string(19) "2022-02-28 23:00:00" [1]=> string(19) "2021-03-31 21:59:00" }

var_dump(getStartAndEnd('2021-01-01', '2021-12-31', 'd'));
// output: { [0]=> string(19) "2020-12-31 23:00:00" [1]=> string(19) "2021-12-31 22:59:00" }

var_dump(getStartAndEnd(null, null, null, '14', '2021'));
// output: { [0]=> string(19) "2021-04-04 22:00:00" [1]=> string(19) "2021-04-11 21:59:00" }