import { useState, useEffect, useCallback } from 'react'; import dayjs from '@/utils/dayjs'; import { Button, TextField, Select, MenuItem, FormControl, InputLabel, Paper, Stack, Typography, Box, IconButton, Snackbar, Alert, } from '@mui/material'; import ContentCopyIcon from '@mui/icons-material/ContentCopy'; const ZONES = ['Asia/Shanghai', 'America/New_York', 'Europe/London'] as const; export default function TimestampPage() { const [now, setNow] = useState(() => Date.now()); const [mode, setMode] = useState<'ts2dt' | 'dt2ts'>('ts2dt'); const [tsInput, setTsInput] = useState(() => String(Date.now())); const [dtInput, setDtInput] = useState(() => dayjs().format('YYYY/MM/DD HH:mm:ss')); const [result, setResult] = useState(''); const [unit, setUnit] = useState<'ms' | 's'>('ms'); const [zone, setZone] = useState<(typeof ZONES)[number]>('Asia/Shanghai'); const [error, setError] = useState(''); const [snack, setSnack] = useState<{ open: boolean; msg: string }>({ open: false, msg: '' }); useEffect(() => { const t = setInterval(() => setNow(Date.now()), 1000); return () => clearInterval(t); }, []); const copy = useCallback(async (text: string) => { try { await navigator.clipboard.writeText(text); setSnack({ open: true, msg: '已复制' }); } catch { setSnack({ open: true, msg: '复制失败' }); } }, []); const convertTs2Dt = useCallback(() => { if (!tsInput) { setError('请输入时间戳'); return; } const num = Number(tsInput); if (isNaN(num)) { setError('无效数字'); return; } const d = unit === 'ms' ? dayjs(num) : dayjs.unix(num); if (!d.isValid()) { setError('无效时间戳'); return; } setError(''); setResult(d.tz(zone).format('YYYY/MM/DD HH:mm:ss')); }, [tsInput, unit, zone]); const convertDt2Ts = useCallback(() => { if (!dtInput) { setError('请输入日期时间'); return; } const d = dayjs.tz(dtInput, 'YYYY/MM/DD HH:mm:ss', zone); if (!d.isValid()) { setError('无效格式 (YYYY/MM/DD HH:mm:ss)'); return; } setError(''); const ms = d.valueOf(); setResult(unit === 'ms' ? String(ms) : String(Math.floor(ms / 1000))); }, [dtInput, zone, unit]); return ( {Math.floor(now / (unit === 'ms' ? 1 : 1000))} {unit === 'ms' ? '毫秒' : '秒'} {mode === 'ts2dt' ? ( <> { setTsInput(e.target.value); setError(''); }} error={!!error} helperText={error} fullWidth size="small" /> 单位 ) : ( <> { setDtInput(e.target.value); setError(''); }} error={!!error} helperText={error || '格式: YYYY/MM/DD HH:mm:ss'} fullWidth size="small" /> 单位 )} 时区 copy(result)}> ) : undefined, }} /> setSnack({ ...snack, open: false })}> {snack.msg} ); }