setTimezone('America/New_York')->toDateString(); } /** Reject missing dates rather than Carbon's implicit current-time fallback. */ public static function time($sourceTime, string $sourceTimezone = 'Asia/Shanghai'): Carbon { if ($sourceTime instanceof \DateTimeInterface) return Carbon::instance($sourceTime); if ($sourceTime === null || trim((string) $sourceTime) === '') { throw new InvalidArgumentException('Source time is missing'); } if (is_numeric($sourceTime)) { if (!preg_match('/^\d{9,11}$/D', (string) $sourceTime)) { throw new InvalidArgumentException('Invalid source timestamp'); } return Carbon::createFromTimestamp((int) $sourceTime, 'UTC'); } if (!preg_match('/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/D', (string) $sourceTime)) { throw new InvalidArgumentException('Invalid source datetime'); } $parsed = Carbon::parse($sourceTime, $sourceTimezone); if ($parsed->format('Y-m-d H:i:s') !== str_replace('T', ' ', substr((string) $sourceTime, 0, 19))) { throw new InvalidArgumentException('Source datetime is not a valid calendar date'); } return $parsed; } }