mscherer 3 年 前
コミット
adddf2ccce

+ 1 - 0
phpstan.neon

@@ -30,6 +30,7 @@ parameters:
 			message: '#Instanceof between mixed and .+ComparisonExpression will always evaluate to false\.#'
 			path: '%rootDir%/../../../src/Model/Behavior/BitmaskedBehavior.php'
 		- '#Parameter \#4 \$flags of function preg_match expects TFlags of 0\|256\|512\|768, int given.#'
+		- '#Parameter \#2 \$\w+ of function datefmt_format expects .+, DateTimeInterface given.#'
 services:
 	-
 		class: Cake\PHPStan\AssociationTableMixinClassReflectionExtension

+ 28 - 35
src/Utility/Time.php

@@ -6,7 +6,7 @@ use Cake\Chronos\Date;
 use Cake\Chronos\MutableDate;
 use Cake\Core\Configure;
 use Cake\I18n\FrozenDate;
-use Cake\I18n\FrozenTime;
+use Cake\I18n\FrozenTime as CakeFrozenTime;
 use Cake\I18n\Time as CakeTime;
 use DateInterval;
 use DateTime;
@@ -62,11 +62,11 @@ class Time extends CakeTime {
 	public function hasDaylightSavingTime($timezone = null) {
 		$timezone = $this->safeCreateDateTimeZone($timezone);
 		// a date outside of DST
-		$offset = $timezone->getOffset(new FrozenTime('@' . mktime(0, 0, 0, 2, 1, (int)date('Y'))));
+		$offset = $timezone->getOffset(new CakeFrozenTime('@' . mktime(0, 0, 0, 2, 1, (int)date('Y'))));
 		$offset = $offset / HOUR;
 
 		// a date inside of DST
-		$offset2 = $timezone->getOffset(new FrozenTime('@' . mktime(0, 0, 0, 8, 1, (int)date('Y'))));
+		$offset2 = $timezone->getOffset(new CakeFrozenTime('@' . mktime(0, 0, 0, 8, 1, (int)date('Y'))));
 		$offset2 = $offset2 / HOUR;
 
 		return abs($offset2 - $offset) > 0;
@@ -119,12 +119,12 @@ class Time extends CakeTime {
 
 		$startDate = $start;
 		if (!is_object($start)) {
-			$startDate = new FrozenTime($start);
+			$startDate = new CakeFrozenTime($start);
 		}
 
 		$endDate = $end;
 		if (!is_object($end)) {
-			$endDate = new FrozenTime($end);
+			$endDate = new CakeFrozenTime($end);
 		}
 
 		if ($startDate > $endDate) {
@@ -338,7 +338,7 @@ class Time extends CakeTime {
 	public function incrementDate($startDate, $years = 0, $months = 0, $days = 0, $timezone = null) {
 		$dateTime = $startDate;
 		if (!is_object($startDate)) {
-			$dateTime = new FrozenTime($startDate);
+			$dateTime = new CakeFrozenTime($startDate);
 			if ($timezone) {
 				$dateTime = $dateTime->setTimezone($this->safeCreateDateTimeZone($timezone));
 			}
@@ -375,7 +375,7 @@ class Time extends CakeTime {
 			$secondAge = $firstAge;
 		}
 		//TODO: other relative time then today should work as well
-		$date = new FrozenTime($relativeTime ?? 'now');
+		$date = new CakeFrozenTime($relativeTime ?? 'now');
 
 		$max = mktime(23, 23, 59, (int)$date->format('m'), (int)$date->format('d'), (int)$date->format('Y') - $firstAge);
 		$min = mktime(0, 0, 1, (int)$date->format('m'), (int)$date->format('d') + 1, (int)$date->format('Y') - $secondAge - 1);
@@ -414,8 +414,13 @@ class Time extends CakeTime {
 	 * @param array<string, mixed> $options
 	 * @return string
 	 */
-	public static function localDate($dateString, $format = null, array $options = []) {
-		$defaults = ['default' => '-----', 'timezone' => null];
+	public static function localDate(?string $dateString, ?string $format = null, array $options = []) {
+		$defaults = [
+			'default' => '-----',
+			'timezone' => null,
+			'language' => 'en',
+			'oclock' => null,
+		];
 		$options += $defaults;
 
 		if ($options['timezone'] === null && strlen($dateString) === 10) {
@@ -427,32 +432,20 @@ class Time extends CakeTime {
 		if ($options['timezone']) {
 			$options['timezone'] = static::safeCreateDateTimeZone($options['timezone']);
 		}
-		$date = new FrozenTime($dateString, $options['timezone']);
-		$date = $date->format('U');
-
-		if ($date <= 0) {
-			return $options['default'];
-		}
-
+		$date = new CakeFrozenTime($dateString, $options['timezone']);
 		if ($format === null) {
 			if (is_int($dateString) || strpos($dateString, ' ') !== false) {
-				$format = FORMAT_LOCAL_YMDHM;
+				$format = 'd.m.Y, H:i';
 			} else {
-				$format = FORMAT_LOCAL_YMD;
+				$format = 'd.m.Y';
 			}
 		}
 
-		$date = static::_strftime($format, (int)$date);
-
-		if (!empty($options['oclock'])) {
-			switch ($format) {
-				case FORMAT_LOCAL_YMDHM:
-				case FORMAT_LOCAL_YMDHMS:
-				case FORMAT_LOCAL_HM:
-				case FORMAT_LOCAL_HMS:
-					$date .= ' ' . __d('tools', 'o\'clock');
+		$date = FrozenTime::formatLocalized($date, $format, $options['language']);
 
-					break;
+		if ($options['oclock']) {
+			if (strpos($format, 'H:i') !== false) {
+				$date .= ' ' . __d('tools', 'o\'clock');
 			}
 		}
 
@@ -515,7 +508,7 @@ class Time extends CakeTime {
 			if (strlen($dateString) === 10) {
 				$date = new FrozenDate($dateString);
 			} else {
-				$date = new FrozenTime($dateString);
+				$date = new CakeFrozenTime($dateString);
 			}
 		} else {
 			$date = $dateString;
@@ -995,7 +988,7 @@ class Time extends CakeTime {
 	 * @return bool True if datetime is not today AND is in the future
 	 */
 	public static function isNotTodayAndInTheFuture($dateString, $timezone = null) {
-		$date = new FrozenTime($dateString, $timezone);
+		$date = new CakeFrozenTime($dateString, $timezone);
 		$date = $date->format('U');
 
 		return date(FORMAT_DB_DATE, (int)$date) > date(FORMAT_DB_DATE, time());
@@ -1010,7 +1003,7 @@ class Time extends CakeTime {
 	 */
 	public static function isInTheFuture($date, $timezone = null) {
 		if (!($date instanceof DateTimeInterface)) {
-			$date = new FrozenTime($date, $timezone);
+			$date = new CakeFrozenTime($date, $timezone);
 		}
 		$date = $date->format('U');
 
@@ -1126,9 +1119,9 @@ class Time extends CakeTime {
 	 * @return string Partial SQL string.
 	 */
 	public static function daysAsSql($begin, $end, $fieldName, $timezone = null) {
-		$begin = new FrozenTime($begin, $timezone);
+		$begin = new CakeFrozenTime($begin, $timezone);
 		$begin = $begin->format('U');
-		$end = new FrozenTime($end, $timezone);
+		$end = new CakeFrozenTime($end, $timezone);
 		$end = $end->format('U');
 		$begin = date('Y-m-d', (int)$begin) . ' 00:00:00';
 		$end = date('Y-m-d', (int)$end) . ' 23:59:59';
@@ -1281,8 +1274,8 @@ class Time extends CakeTime {
 	 */
 	public static function duration($duration, $format = '%h:%I:%S') {
 		if (!$duration instanceof \DateInterval) {
-			$d1 = new FrozenTime();
-			$d2 = new FrozenTime();
+			$d1 = new CakeFrozenTime();
+			$d2 = new CakeFrozenTime();
 			$d2 = $d2->add(new DateInterval('PT' . $duration . 'S'));
 
 			$duration = $d2->diff($d1);

+ 0 - 4
tests/TestCase/Utility/FrozenTimeTest.php

@@ -213,10 +213,6 @@ class FrozenTimeTest extends TestCase {
 	 * @return void
 	 */
 	public function testLocalDate() {
-		//$this->skipIf(true, '//Doesnt work on GithubActions CI');
-		//$res = setlocale(LC_TIME, ['de_DE.UTF-8', 'deu_deu']);
-		//$this->assertTrue(!empty($res), 'Result: ' . Debugger::exportVar($res, true));
-
 		$values = [
 			['2009-12-01 00:00:00', 'd.m.Y', '01.12.2009'],
 			['2009-12-01 00:00:00', 'M', 'Dez.'],

+ 8 - 15
tests/TestCase/Utility/TimeTest.php

@@ -3,7 +3,6 @@
 namespace Tools\Test\TestCase\Utility;
 
 use Cake\Core\Configure;
-use Cake\Error\Debugger;
 use DateTime;
 use Shim\TestSuite\TestCase;
 use Tools\Utility\Time;
@@ -41,7 +40,7 @@ class TimeTest extends TestCase {
 	 */
 	public function testIncrementDate() {
 		$timezone = Configure::read('Config.timezone');
-		//$timezone = Date$this->Time->timezone();
+
 		Configure::write('Config.timezone', 'Europe/Berlin');
 		$phpTimezone = date_default_timezone_get();
 		date_default_timezone_set('Europe/Berlin');
@@ -209,30 +208,24 @@ class TimeTest extends TestCase {
 	 * @return void
 	 */
 	public function testLocalDate() {
-		$this->skipIf(true, '//Doesnt work on GithubActions CI');
-
-		$res = setlocale(LC_TIME, ['de_DE.UTF-8', 'deu_deu']);
-		$this->assertTrue(!empty($res), 'Result: ' . Debugger::exportVar($res, true));
-
 		$values = [
-			['2009-12-01 00:00:00', FORMAT_LOCAL_YMD, '01.12.2009'],
-			['2009-12-01 00:00:00', FORMAT_LOCAL_M_FULL, 'Dezember'],
+			['2009-12-01 00:00:00', 'd.m.Y', '01.12.2009'],
+			['2009-12-01 00:00:00', 'M', 'Dez.'],
 		];
 		foreach ($values as $v) {
-			$ret = $this->Time->localDate($v[0], $v[1]);
-			//$this->debug($ret);
+			$ret = $this->Time->localDate($v[0], $v[1], ['language' => 'de']);
 			$this->assertEquals($v[2], $ret);
 		}
 
 		$date = '2009-12-01 00:00:00';
-		$format = FORMAT_LOCAL_YMD;
-		$result = $this->Time->localDate($date, $format, ['oclock' => true]);
+		$format = 'd.m.Y';
+		$result = $this->Time->localDate($date, $format, ['language' => 'de', 'oclock' => true]);
 		$expected = '01.12.2009';
 		$this->assertEquals($expected, $result);
 
 		$date = '2009-12-01 00:00:00';
-		$format = FORMAT_LOCAL_YMDHM;
-		$result = $this->Time->localDate($date, $format, ['oclock' => true]);
+		$format = 'd.m.Y, H:i';
+		$result = $this->Time->localDate($date, $format, ['language' => 'de', 'oclock' => true]);
 		$expected = '01.12.2009, 00:00 ' . __d('tools', 'o\'clock');
 		$this->assertEquals($expected, $result);
 	}