Raketenwissenschaftler: PHP Datumsformat wandeln

Beitrag lesen

in einer CSV steht das Datum in folgendem deutschen Format:

01-Nov-2019, 25-Okt-2019.

Ich muss das Datum jetzt in das Format "d.m.Y" wandeln.

Mal ganz generell gefragt:

Hast Du denn Einfluss auf das Format? Es dürfte aus leicht begreiflichen Gründen sehr viel klüger sein, beim Export bzw. Erzeugen der CSV-Datei darauf zu achten, dass für ein Datum das allgemein verständlichere ISO-Format (eg. '2019-12-31') verwendet wird. Die Katze zu schleudern und in den Wäschetrockner zu packen nachdem man sie in der Maschine bei 60° mit gewaschen hat macht selbige zwar trocken - aber keineswegs wieder lebendig.

"Schleuder und Wäschetrockner"

<?php
class date_create_from_locale_d_M_Y {

    private static $defaultErrorType = E_USER_NOTICE;
	private $search ;
	private $replace = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	protected $locale;
	private $allLocales;

	function __construct(
		$locale = FALSE,
		$errorType = ''
	) {
		$this->setLocale ( $locale );
	}
	
	public function setLocale ($locale ) {
		if ( FALSE === $locale) {
			$this->locale =  'C';
		} else { 
			$this->locale = $locale;
		}
			
		$oldLocale = $this->getCurrentLocale();
		
		setlocale( LC_ALL, $this->locale ) . PHP_EOL;
		
		$this -> search = [];
		$dto = new DateTime();
		for ( $i=1; $i<13; $i++ ) {
			$dto->setDate('1970', $i , '1');
			$this -> search[] = strftime( '%b', $dto->getTimestamp() );
		}
		setlocale( LC_ALL, $oldLocale );
	}
	
	public function getDateObject ( $string, $errorType = FALSE ) {
		if ( FALSE === $errorType ) { 
			$errorType = self::$defaultErrorType;
		} else {
			$this->checkErrorType( $errorType );
		}
						
		$d = date_create_from_format(
			'j-M-Y',
			str_replace( $this->search, $this->replace, $string )
		);
		if ( false === $d ) {
			self::onError( $string, $errorType );
			return FALSE;
		}
		return $d;
	}
	
	public function getCurrentLocale() {
		$arr=explode( ';', setlocale(LC_ALL, 0 ) );
		return $arr[0];
	}
	
	public function showMonts() {
		echo implode(' ', $this->search ) . PHP_EOL;
	}
	
	private function onError( $string, $errorType = '' ) {
		if ( '' === $errorType ) $errorType = self::$defaultErrorType;
		trigger_error( __class__ . ':' . __function__ . ':'. " input '$string' is not definied.", $errorType );
	}
	
	private function checkErrorType ( $errorType ) {
		if ( in_array ($errorType, [ E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR ] ) ) {
			return true;
		} else {
			trigger_error( __class__ . ':' . __function__ . ':'. " Der Errortype darf nur [ E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR ] sein. Gesetzt wurde '$errorType'", E_USER_ERROR );
		}
	}
	
}

####################### Usage / Tests #####################

echo 'TESTS:' .  PHP_EOL;

foreach (
		[
			'C',
			'de_DE.utf8',
			'en_US.utf8',
			'fr_FR.utf8',
			'pl_PL.utf8',
			'ru_RU.utf8',
			'xh_ZA.utf8'
		]
	as $loc
	) {
		
		$arr = explode( ';', setlocale( LC_ALL, 0 ) );
		$oldLocale = $arr[0];
		setlocale( LC_ALL, $loc ) . PHP_EOL;
		$dto = new DateTime();
		$months=[];
		
		
		for ( $i=1; $i<13; $i++ ) {
			$dto->setDate('1970', $i , '1');
			$months[] = strftime( '%b', $dto->getTimestamp() );
		}
		setlocale( LC_ALL, $oldLocale );
        $dates=[];
        foreach ( $months as $m ) {
			$dates[] = '28-' . $m . '-1970';
		}
		$object = new date_create_from_locale_d_M_Y('C');
		$object -> setlocale($loc);

		echo PHP_EOL;
		echo '---------------------------' .  PHP_EOL;
		echo $loc . ':' . PHP_EOL;
		$object -> showMonts();
		echo '---------------------------' .  PHP_EOL;

		foreach ( $dates as $datum ) {
			$date = $object -> getDateObject( $datum );
			if ( $date ) echo $datum . "\t" . $date->format('Y-m-d') . PHP_EOL;
		}
		echo '---------------------------' .  PHP_EOL;	
	}

exit;