From 45fa74573acc01cc87f4e69cec24ec28a31ee9ec Mon Sep 17 00:00:00 2001 From: Hide_D Date: Wed, 29 Oct 2025 14:58:38 +0000 Subject: [PATCH] feat: VarTurn60 --- hwe/sammo/VarTurn60.php | 176 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 hwe/sammo/VarTurn60.php diff --git a/hwe/sammo/VarTurn60.php b/hwe/sammo/VarTurn60.php new file mode 100644 index 00000000..6dcf301e --- /dev/null +++ b/hwe/sammo/VarTurn60.php @@ -0,0 +1,176 @@ +format('Y-m-d')); + $totalSec = $date->getTimestamp() - $baseDay->getTimestamp(); + + $min30 = intdiv($totalSec, 60 * 30); + + assert($min30 < 48); + + [$turnIdx, $minOffset, ] = static::$min30ToTurn[$min30]; + + $secOffset = $totalSec - 60 * 30 * $min30 + $minOffset * 60; + return new static($baseDay, $turnIdx, $secOffset); + } + + /// $b - $a 의 턴차 + static function calcTurnDiff(\DateTimeInterface $a, \DateTimeInterface $b): int{ + $aObj = static::fromDatetime($a); + $bObj = static::fromDatetime($b); + + $resDays = $aObj->baseDay->diff($bObj->baseDay)->days; //놀랍게도 절대값 + if($aObj->baseDay > $bObj->baseDay){ + $resDays *= -1; + } + + $res = $resDays * 24 + $bObj->turnIdx - $aObj->turnIdx; + + return $res; + } + + function cutTurn($withFraction = true): array{ + [$hour, $minOffset, $turnTerm] = static::$turnToHM[$this->turnIdx]; + $date = $this->baseDay->add(TimeUtil::secondsToDateInterval(($hour * 60 + $minOffset) * 60)); + return [TimeUtil::format($date, $withFraction), $turnTerm]; + } + + function toDateStr($withFraction = true): string{ + [$hour, $minOffset, ] = static::$turnToHM[$this->turnIdx]; + $date = $this->baseDay->add(TimeUtil::secondsToDateInterval(($hour * 60 + $minOffset) * 60 + $this->secOffset)); + return TimeUtil::format($date, $withFraction); + } + + function addTurn(int $moreTurn): self{ + $dayDiff = intdiv($moreTurn, 24); + $moreTurn %= 24; + + $nextTurnIdx = $this->turnIdx + $moreTurn; + if($nextTurnIdx < 0){ + $dayDiff -= 1; + $nextTurnIdx += 24; + } + else if($nextTurnIdx >= 24){ + $dayDiff += 1; + $nextTurnIdx -= 24; + } + + [, , $oldTurnTerm] = static::$turnToHM[$this->turnIdx]; + [, , $nextTurnTerm] = static::$turnToHM[$nextTurnIdx]; + + $nextSecOffset = $this->secOffset; + if($oldTurnTerm != $nextTurnTerm){ + $nextSecOffset *= $nextTurnTerm; + $nextSecOffset /= $oldTurnTerm; + } + + if($dayDiff == 0){ + return new static($this->baseDay, $nextTurnIdx, $nextSecOffset); + } + + if($dayDiff > 0){ + $nextBaseDay = $this->baseDay->add(new \DateInterval("P{$dayDiff}D")); + } + else{ + $dayAbsDiff = abs($dayDiff); + $nextBaseDay = $this->baseDay->sub(new \DateInterval("P{$dayAbsDiff}D")); + } + + return new static($nextBaseDay, $nextTurnIdx, $nextSecOffset); + } +}