setDate(1, 1, 1)->setTime(0, 0); return $d->format($format); } try { $from_obj = new DateTimeZone($tz_from); } catch (Exception $e) { $from_obj = new DateTimeZone('UTC'); } try { $d = new DateTime($s, $from_obj); } catch (Exception $e) { try { $d = new DateTime(self::fix($s), $from_obj); } catch (\Throwable $e) { Logger::warning('DateTimeFormat::convert: exception: ' . $e->getMessage()); $d = new DateTime('now', $from_obj); } } try { $to_obj = new DateTimeZone($tz_to); } catch (Exception $e) { $to_obj = new DateTimeZone('UTC'); } $d->setTimezone($to_obj); return $d->format($format); } /** * Fix weird date formats. * * Note: This method isn't meant to sanitize valid date/time strings, for example it will mangle relative date * strings like "now - 3 days". * * @see \Friendica\Test\src\Util\DateTimeFormatTest::dataFix() for a list of examples handled by this method. * @param string $dateString * @return string */ public static function fix(string $dateString): string { $search = ['Mär', 'März', 'Mai', 'Juni', 'Juli', 'Okt', 'Dez', 'ET' , 'ZZ', ' - ', '+', '+', ' (Coordinated Universal Time)', '\\']; $replace = ['Mar', 'Mar' , 'May', 'Jun' , 'Jul' , 'Oct', 'Dec', 'EST', 'Z' , ', ' , '+' , '+' , '' , '']; $dateString = str_replace($search, $replace, $dateString); $pregPatterns = [ ['#(\w+), (\d+ \w+ \d+) (\d+:\d+:\d+) (.+)#', '$2 $3 $4'], ['#(\d+:\d+) (\w+), (\w+) (\d+), (\d+)#', '$1 $2 $3 $4 $5'], ]; foreach ($pregPatterns as $pattern) { $dateString = preg_replace($pattern[0], $pattern[1], $dateString); } return $dateString; } /** * Checks, if the given string is a date with the pattern YYYY-MM * * @param string $dateString The given date * * @return boolean True, if the date is a valid pattern */ public function isYearMonth(string $dateString) { // Check format (2019-01, 2019-1, 2019-10) if (!preg_match('/^([12]\d{3}-(1[0-2]|0[1-9]|\d))$/', $dateString)) { return false; } $date = DateTime::createFromFormat('Y-m', $dateString); if (!$date) { return false; } try { $now = new DateTime(); } catch (\Throwable $t) { return false; } if ($date > $now) { return false; } return true; } /** * Checks, if the given string is a date with the pattern YYYY-MM-DD * * @param string $dateString The given date * * @return boolean True, if the date is a valid pattern */ public function isYearMonthDay(string $dateString) { $date = DateTime::createFromFormat('Y-m-d', $dateString); if (!$date) { return false; } if (DateTime::getLastErrors()['error_count'] || DateTime::getLastErrors()['warning_count']) { return false; } return true; } }