import { useState, useCallback } from 'react'; import dayjs from 'dayjs'; import { Button, TextField, Select, MenuItem, FormControl, InputLabel, Paper, Typography, Stack, Box, SelectChangeEvent, } from '@mui/material'; import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); const TIME_ZONE_LIST = [ 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'America/Anchorage', 'America/Honolulu', 'Europe/London', 'Europe/Paris', 'Europe/Berlin', 'Europe/Moscow', 'Asia/Tokyo', 'Asia/Shanghai', 'Asia/Hong_Kong', 'Asia/Singapore', 'Asia/Dubai', 'Asia/Kolkata', 'Australia/Sydney', 'Pacific/Auckland', ]; const TIMESTAMP_UNITS = [ { value: 'milliseconds', label: '毫秒 (ms)' }, { value: 'seconds', label: '秒 (s)' }, ]; export function TimestampToDatetime() { const [timestampValue, setTimestampValue] = useState(() => dayjs().valueOf().toString()); const [timestampResult, setTimestampResult] = useState(''); const [unit, setUnit] = useState('milliseconds'); const [selectedZone, setSelectedZone] = useState('Asia/Shanghai'); const [error, setError] = useState(''); const performConversion = useCallback((val: string, zone: string, u: string) => { if (!val || val.trim() === '') { setError('请输入有效的时间戳'); return ''; } const numberValue = Number(val); if (isNaN(numberValue)) { setError('时间戳必须是数字'); return ''; } const d = u === 'milliseconds' ? dayjs(numberValue) : dayjs.unix(numberValue); if (!d.isValid()) { setError('无效的时间戳格式'); return ''; } setError(''); return d.tz(zone).format('YYYY/MM/DD HH:mm:ss'); }, []); const handleConvert = useCallback(() => { const newResult = performConversion(timestampValue, selectedZone, unit); setTimestampResult(newResult); }, [timestampValue, selectedZone, unit, performConversion]); const handleInputChange = useCallback( (e: React.ChangeEvent) => { setTimestampValue(e.target.value); if (error) setError(''); }, [error], ); const handleZoneChange = useCallback( (e: SelectChangeEvent) => { const newZone = e.target.value; setSelectedZone(newZone); if (timestampResult) { const newResult = performConversion(timestampValue, newZone, unit); setTimestampResult(newResult || ''); } }, [performConversion, timestampResult, timestampValue, unit], ); const handleUnitChange = useCallback( (e: SelectChangeEvent) => { const newUnit = e.target.value; setUnit(newUnit); if (timestampResult) { const newResult = performConversion(timestampValue, selectedZone, newUnit); setTimestampResult(newResult || ''); } }, [performConversion, timestampResult, timestampValue, selectedZone], ); return ( 时间戳转日期时间 单位 时区 ); }