You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
64 lines
1.8 KiB
import { getTime, setTime } from 'apis/system'
|
|
import { formatDateTime } from 'libs/utils'
|
|
import { onMounted, onUnmounted, ref } from 'vue'
|
|
|
|
export function useServerTime() {
|
|
const serverTime = ref<number | null>(null) // 初始服务器时间戳
|
|
const clientFetchTime = ref<number | null>(null) // 获取服务器时间时的客户端时间戳
|
|
const currentTime = ref<string>('0000-00-00 00:00:00')
|
|
const editVisible = ref(false)
|
|
|
|
let interval: number | null = null
|
|
|
|
onMounted(async () => {
|
|
try {
|
|
await getDateTime()
|
|
}
|
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
catch (error) {
|
|
// currentTime.value = formatDateTime(undefined, new Date())
|
|
console.error('获取服务器时间失败')
|
|
}
|
|
})
|
|
|
|
const openDialog = () => {
|
|
editVisible.value = true
|
|
}
|
|
|
|
const closeDialog = () => {
|
|
editVisible.value = false
|
|
}
|
|
|
|
const getDateTime = async () => {
|
|
serverTime.value = (await getTime())?.epochMilli
|
|
clientFetchTime.value = Date.now()
|
|
let num = 0
|
|
if (interval)
|
|
clearInterval(interval)
|
|
interval = window.setInterval(async () => {
|
|
if (num > 60) {
|
|
serverTime.value = (await getTime())?.epochMilli
|
|
clientFetchTime.value = Date.now()
|
|
num = 0
|
|
}
|
|
if (serverTime.value && clientFetchTime.value) {
|
|
const elapsed = Date.now() - clientFetchTime.value
|
|
const currentServerTime = serverTime.value + elapsed
|
|
currentTime.value = formatDateTime(undefined, new Date(currentServerTime))
|
|
num++
|
|
}
|
|
}, 1000)
|
|
}
|
|
|
|
const setDateTime = async (time: number) => {
|
|
await setTime(time)
|
|
await getDateTime()
|
|
}
|
|
|
|
onUnmounted(() => {
|
|
if (interval)
|
|
clearInterval(interval)
|
|
})
|
|
|
|
return { currentTime, serverTime, editVisible, setDateTime, openDialog, closeDialog }
|
|
}
|