DateFormatter.php

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 2

Klassen 1

Funktionen 7

Versionen 1

Code

<?php

declare(strict_types=1);

namespace Infrastructure\Formatter;

// @responsibility: Formatiert Datums-/Zeitwerte konsistent (DE-Format)

use DateTimeImmutable;
use DateTimeInterface;

final class DateFormatter
{
    private const GERMAN_MONTHS = [
        1 => 'Januar', 2 => 'Februar', 3 => 'März', 4 => 'April',
        5 => 'Mai', 6 => 'Juni', 7 => 'Juli', 8 => 'August',
        9 => 'September', 10 => 'Oktober', 11 => 'November', 12 => 'Dezember',
    ];

    /**
     * Format as short date (dd.mm.yyyy).
     */
    public function short(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        return $this->parse($datetime)->format('d.m.Y');
    }

    /**
     * Format as date with time (dd.mm.yyyy HH:mm).
     */
    public function dateTime(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        return $this->parse($datetime)->format('d.m.Y H:i');
    }

    /**
     * Format as long German date (1. Januar 2025).
     */
    public function longGerman(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        $date = $this->parse($datetime);

        return $date->format('j') . '. ' . self::GERMAN_MONTHS[(int) $date->format('n')] . ' ' . $date->format('Y');
    }

    /**
     * Format as ISO 8601 (for APIs).
     */
    public function iso(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        return $this->parse($datetime)->format(DateTimeInterface::ATOM);
    }

    /**
     * Format as relative time (vor 5 Minuten, gestern, etc.).
     */
    public function relative(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        $date = $this->parse($datetime);
        $now = new DateTimeImmutable();
        $diff = $now->diff($date);

        if ($diff->invert === 0) {
            // Future date
            return $this->dateTime($datetime);
        }

        if ($diff->days === 0) {
            if ($diff->h === 0) {
                if ($diff->i === 0) {
                    return 'gerade eben';
                }

                return $diff->i === 1 ? 'vor 1 Minute' : "vor {$diff->i} Minuten";
            }

            return $diff->h === 1 ? 'vor 1 Stunde' : "vor {$diff->h} Stunden";
        }

        if ($diff->days === 1) {
            return 'gestern';
        }

        if ($diff->days < 7) {
            return "vor {$diff->days} Tagen";
        }

        return $this->short($datetime);
    }

    /**
     * Format time only (HH:mm).
     */
    public function time(?string $datetime): string
    {
        if ($datetime === null || $datetime === '') {
            return '';
        }

        return $this->parse($datetime)->format('H:i');
    }

    /**
     * Parse a datetime string.
     */
    private function parse(string $datetime): DateTimeImmutable
    {
        return new DateTimeImmutable($datetime);
    }
}
← Übersicht Graph