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;