From ceb03224b51637f16d2c3da7ea9c4be77236feb7 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 19 May 2026 15:33:47 +0800 Subject: [PATCH] Fix Carbon parsing for JS date strings with timezone names --- .../Api/AttendanceSyncController.php | 5 ++- test-sync.php | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test-sync.php diff --git a/app/Http/Controllers/Api/AttendanceSyncController.php b/app/Http/Controllers/Api/AttendanceSyncController.php index 62d5f1451..984c46878 100644 --- a/app/Http/Controllers/Api/AttendanceSyncController.php +++ b/app/Http/Controllers/Api/AttendanceSyncController.php @@ -162,8 +162,11 @@ class AttendanceSyncController extends Controller return \Carbon\Carbon::createFromTimestamp($dateStr); } + // Remove JS-specific timezone names like "(China Standard Time)" to prevent Carbon parse errors + $cleanDateStr = trim(explode('(', $dateStr)[0]); + try { - return \Carbon\Carbon::parse($dateStr); + return \Carbon\Carbon::parse($cleanDateStr); } catch (\Exception $e) { return null; } diff --git a/test-sync.php b/test-sync.php new file mode 100644 index 000000000..1762e6c84 --- /dev/null +++ b/test-sync.php @@ -0,0 +1,38 @@ +make(Illuminate\Contracts\Console\Kernel::class); +$kernel->bootstrap(); + +function parseDateSafe($dateStr) { + if (!$dateStr) return null; + if (is_numeric($dateStr)) { + if (strlen((string)$dateStr) > 10) return \Carbon\Carbon::createFromTimestampMs($dateStr); + return \Carbon\Carbon::createFromTimestamp($dateStr); + } + try { + return \Carbon\Carbon::parse($dateStr); + } catch (\Exception $e) { + return null; + } +} + +$attendances = [ + ['deviceUserId' => '2006', 'recordTime' => '2026-05-19 14:00:00'], + ['id' => '1', 'timestamp' => '2026-05-19T08:00:00.000Z'] +]; + +$formattedAttendances = []; +foreach ($attendances as $record) { + $empCode = $record['deviceUserId'] ?? $record['id'] ?? null; + $rawPunchTime = $record['recordTime'] ?? $record['timestamp'] ?? null; + $punchTime = parseDateSafe($rawPunchTime); + + if ($empCode && $punchTime) { + $formattedAttendances[] = [ + 'emp_code' => (string) $empCode, + 'punch_time' => $punchTime->toDateTimeString(), + ]; + } +} +var_dump($formattedAttendances);