功能强大的时钟源代码

1.先看效果

2.源代码

"use client"


import { useState, useEffect } from 'react'

import { Moon, Sun } from 'lucide-react'

import { Button } from "@/components/ui/button"

import { Switch } from "@/components/ui/switch"


const cities = [

{ name: 'New York', offset: -4 },

{ name: 'London', offset: 1 },

{ name: 'Tokyo', offset: 9 },

{ name: 'Sydney', offset: 10 },

]


export default function AdvancedClock() {

const [time, setTime] = useState(new Date())

const [isDarkMode, setIsDarkMode] = useState(false)

const [isStopwatchRunning, setIsStopwatchRunning] = useState(false)

const [stopwatchTime, setStopwatchTime] = useState(0)


useEffect(() => {

const timer = setInterval(() => setTime(new Date()), 1000)

return () => clearInterval(timer)

}, [])


useEffect(() => {

if (isStopwatchRunning) {

const stopwatchTimer = setInterval(() => setStopwatchTime(prev => prev + 1), 10)

return () => clearInterval(stopwatchTimer)

}

}, [isStopwatchRunning])


const toggleTheme = () => setIsDarkMode(!isDarkMode)


const toggleStopwatch = () => setIsStopwatchRunning(!isStopwatchRunning)


const resetStopwatch = () => {

setIsStopwatchRunning(false)

setStopwatchTime(0)

}


const formatTime = (date: Date) => {

return date.toLocaleTimeString('en-US', { hour12: false })

}


const formatStopwatchTime = (time: number) => {

const minutes = Math.floor(time / 6000)

const seconds = Math.floor((time % 6000) / 100)

const milliseconds = time % 100

return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(2, '0')}`

}


return (

Advanced Clock


{formatTime(time)}

{time.toDateString()}

{[...Array(12)].map((_, i) => (

key={i}

className="absolute w-1 h-4 bg-gray-400 dark:bg-gray-600"

style={{

transform: `rotate(${i * 30}deg)`,

transformOrigin: '50% 100%',

left: 'calc(50% - 0.5px)',

bottom: '50%',

}}

>

))}

className="absolute w-1 h-16 bg-black dark:bg-white"

style={{

transform: `rotate(${time.getHours() * 30 + time.getMinutes() * 0.5}deg)`,

transformOrigin: '50% 100%',

left: 'calc(50% - 0.5px)',

bottom: '50%',

}}

>

className="absolute w-1 h-24 bg-black dark:bg-white"

style={{

transform: `rotate(${time.getMinutes() * 6}deg)`,

transformOrigin: '50% 100%',

left: 'calc(50% - 0.5px)',

bottom: '50%',

}}

>

className="absolute w-0.5 h-28 bg-red-500"

style={{

transform: `rotate(${time.getSeconds() * 6}deg)`,

transformOrigin: '50% 100%',

left: 'calc(50% - 0.25px)',

bottom: '50%',

}}

>


Stopwatch

{formatStopwatchTime(stopwatchTime)}


World Clock

{cities.map(city => (

{city.name}

{formatTime(new Date(time.getTime() + city.offset * 3600000))}

))}

)

}

发布人: xiaolan

发布时间: 2024-10-08 13:25:38

#源码分享
×
二维码

扫描二维码分享

评论区

登录后发表评论。