/** * Converts a 24-hour time string to 12-hour format. * * @param {string} time24 - Time in HH:mm or HH:mm:ss format * @returns {string} Time in 12-hour format (e.g. "3:45 PM") * * @example * convertTo12HRTime('14:30') // "2:30 PM" */ export function convertTo12HRTime(time24) { if (!time24) return '' return new Date(`1970-01-01T${time24}Z`).toLocaleTimeString('en-US', { timeZone: 'UTC', hour: 'numeric', minute: 'numeric', hour12: true }) } /** * Formats a Date object into "Mon DD, YYYY". * * @param {Date} date * @returns {string} * * @example * formatDate(new Date()) // "Jan 31, 2026" */ export function formatDate(date) { if (!(date instanceof Date)) return '' return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) } /** * Returns today's date in GMT+8 timezone in "YYYY-MM-DD" format. * * @returns {string} - Date string in GMT+8 * * @example * getDateInGMT8() // "2026-01-31" */ export function getDateInGMT8() { const now = new Date() const utcTime = now.getTime() const gmt8Offset = 8 * 60 * 60 * 1000 const gmt8Time = new Date(utcTime + gmt8Offset) return gmt8Time.toISOString().split('T')[0] } /** * Converts a date-time string into a readable format. * * Supports: * - "YYYY-MM-DD" * - "YYYY-MM-DD HH:mm:ss" * - ISO strings * * @param {string} dateTimeString * @returns {string} * * @example * formatDateTimetoReadable('2026-01-31 14:30') * // "January 31, 2026 2:30PM" */ export function formatDateTimetoReadable(dateTimeString) { if (!dateTimeString) return '' const normalized = dateTimeString.includes(' ') ? dateTimeString.replace(' ', 'T') : dateTimeString const date = new Date(normalized) if (isNaN(date.getTime())) return '' const datePart = date.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }) // Only show time if original string had time if (!dateTimeString.includes(' ')) { return datePart } let hours = date.getHours() const minutes = date.getMinutes() const ampm = hours >= 12 ? 'PM' : 'AM' hours = hours % 12 || 12 const paddedMinutes = minutes.toString().padStart(2, '0') return `${datePart} ${hours}:${paddedMinutes}${ampm}` }