import { useState, useCallback } from 'react'; import dayjs from '@/utils/dayjs'; import { Button, TextField, Select, MenuItem, FormControl, InputLabel, Paper, Stack, Box, SelectChangeEvent, } from '@mui/material'; import { TIME_ZONE_LIST, TIMESTAMP_UNITS } from './constants'; export function DatetimeToTimestamp() { const [dateValue, setDateValue] = useState(() => dayjs().format('YYYY/MM/DD HH:mm:ss')); const [selectedZone, setSelectedZone] = useState('Asia/Shanghai'); const [result, setResult] = useState(''); const [unit, setUnit] = useState('milliseconds'); const [error, setError] = useState(''); const performConversion = useCallback( (currentDate: string, zone: string, currentUnit: string) => { if (!currentDate) { setError('请输入有效的日期时间'); return ''; } // 使用 tz 方法直接解析带时区的日期 const timestamp = dayjs.tz(currentDate, 'YYYY/MM/DD HH:mm:ss', zone); if (!timestamp.isValid()) { setError('无效的日期时间格式'); return ''; } setError(''); const ms = timestamp.valueOf(); return currentUnit === 'milliseconds' ? ms.toString() : Math.floor(ms / 1000).toString(); }, [], ); const handleConvert = useCallback(() => { const newResult = performConversion(dateValue, selectedZone, unit); setResult(newResult); }, [dateValue, selectedZone, unit, performConversion]); const handleUnitChange = useCallback( (e: SelectChangeEvent) => { const newUnit = e.target.value; setUnit(newUnit); if (result) { setResult(performConversion(dateValue, selectedZone, newUnit) || ''); } }, [dateValue, selectedZone, result, performConversion], ); const handleZoneChange = useCallback((e: SelectChangeEvent) => { setSelectedZone(e.target.value); }, []); return ( { setDateValue(e.target.value); if (error) setError(''); }} error={!!error} helperText={error || '格式: YYYY/MM/DD HH:mm:ss'} fullWidth variant="outlined" /> 时区 单位 ); }