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

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 }
}