78 lines
1.9 KiB
PHP
78 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace Modules\EcommerceFinance\Support;
|
|
|
|
use Carbon\CarbonImmutable;
|
|
use Carbon\CarbonInterface;
|
|
use Throwable;
|
|
|
|
final class OaProcessTime
|
|
{
|
|
private const WAIT_STEP_HOURS = 12;
|
|
|
|
public static function timezone(): string
|
|
{
|
|
$timezone = trim((string) config('app.platform_timezone', ''));
|
|
|
|
return $timezone !== '' ? $timezone : 'Asia/Shanghai';
|
|
}
|
|
|
|
public static function now(): CarbonImmutable
|
|
{
|
|
return CarbonImmutable::now(self::timezone());
|
|
}
|
|
|
|
public static function parse(mixed $value): ?CarbonImmutable
|
|
{
|
|
$text = trim((string) $value);
|
|
if ($text === '') {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
return CarbonImmutable::parse($text, self::timezone())
|
|
->setTimezone(self::timezone());
|
|
} catch (Throwable) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function formatDateTime(mixed $value): string
|
|
{
|
|
return self::parse($value)?->format('Y-m-d H:i') ?? '-';
|
|
}
|
|
|
|
public static function formatWaiting(mixed $value, ?CarbonInterface $now = null): string
|
|
{
|
|
$startedAt = self::parse($value);
|
|
if ($startedAt === null) {
|
|
return '-';
|
|
}
|
|
|
|
$nowAt = $now === null
|
|
? self::now()
|
|
: CarbonImmutable::instance($now)->setTimezone(self::timezone());
|
|
if ($startedAt->greaterThan($nowAt)) {
|
|
return '-';
|
|
}
|
|
|
|
$hours = intdiv($startedAt->diffInSeconds($nowAt), 3600);
|
|
$steps = intdiv($hours, self::WAIT_STEP_HOURS);
|
|
if ($steps < 1) {
|
|
return '不足12小时';
|
|
}
|
|
|
|
$days = intdiv($steps, 2);
|
|
$halfDays = $steps % 2;
|
|
$parts = [];
|
|
if ($days > 0) {
|
|
$parts[] = $days . '天';
|
|
}
|
|
if ($halfDays > 0) {
|
|
$parts[] = self::WAIT_STEP_HOURS . '小时';
|
|
}
|
|
|
|
return implode('', $parts);
|
|
}
|
|
}
|