fix: attendance times showing +1 hour due to UTC timezone conversion

Times in the database are stored as local time (CET). JavaScript's
Date constructor treated them as UTC, then toLocaleTimeString added
+1 hour for CET timezone.

Fix: extract hours/minutes directly from the datetime string via regex
instead of going through Date object. No timezone conversion applied.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-03-23 13:50:30 +01:00
parent bb0bf25ce0
commit 0b4b6b24e1

View File

@@ -24,15 +24,31 @@ export const formatDate = (dateStr: string | null | undefined): string => {
return d.toLocaleDateString('cs-CZ')
}
/** Extract time as HH:MM from a datetime string without timezone conversion */
const extractTime = (datetime: string): string => {
// Try ISO format: "2026-03-23T08:00:00.000Z" or "2026-03-23T08:00:00"
const tMatch = datetime.match(/T(\d{2}):(\d{2})/)
if (tMatch) return `${tMatch[1]}:${tMatch[2]}`
// Try space format: "2026-03-23 08:00:00"
const sMatch = datetime.match(/\s(\d{2}):(\d{2})/)
if (sMatch) return `${sMatch[1]}:${sMatch[2]}`
// Fallback: try parsing time-only "08:00"
const hMatch = datetime.match(/^(\d{2}):(\d{2})/)
if (hMatch) return `${hMatch[1]}:${hMatch[2]}`
return datetime
}
export const formatDatetime = (datetime: string | null | undefined): string => {
if (!datetime) return '—'
const d = new Date(datetime)
return `${d.getDate()}.${d.getMonth() + 1}. ${d.toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })}`
// Extract date part without timezone conversion
const dMatch = datetime.match(/(\d{4})-(\d{2})-(\d{2})/)
const datePart = dMatch ? `${parseInt(dMatch[3])}.${parseInt(dMatch[2])}.` : ''
return `${datePart} ${extractTime(datetime)}`
}
export const formatTime = (datetime: string | null | undefined): string => {
if (!datetime) return '—'
return new Date(datetime).toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })
return extractTime(datetime)
}
export const calculateWorkMinutes = (record: AttendanceRecord): number => {
@@ -123,12 +139,14 @@ export const calcFormWorkMinutes = (form: ShiftForm): number => {
export const formatTimeOrDatetimePrint = (datetime: string | null | undefined, shiftDate: string): string => {
if (!datetime) return '—'
const timeDate = new Date(datetime).toISOString().split('T')[0]
if (timeDate !== shiftDate) {
const d = new Date(datetime)
return `${d.getDate()}.${d.getMonth() + 1}. ${d.toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })}`
// Extract date from the datetime string directly (no timezone conversion)
const dateMatch = datetime.match(/(\d{4})-(\d{2})-(\d{2})/)
const timeDate = dateMatch ? `${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}` : ''
if (timeDate && timeDate !== shiftDate) {
const datePart = `${parseInt(dateMatch![3])}.${parseInt(dateMatch![2])}.`
return `${datePart} ${extractTime(datetime)}`
}
return new Date(datetime).toLocaleTimeString('cs-CZ', { hour: '2-digit', minute: '2-digit' })
return extractTime(datetime)
}
export const calculateWorkMinutesPrint = (record: AttendanceRecord): number => {