feat(工具箱): 实现“Unix 时间戳转换”工具
This commit is contained in:
@@ -39,7 +39,7 @@ export const toolList = [
|
|||||||
{
|
{
|
||||||
id: 'conversion-tools',
|
id: 'conversion-tools',
|
||||||
title: '转换',
|
title: '转换',
|
||||||
enabled: false,
|
enabled: true,
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
id: 'convert-html-entities',
|
id: 'convert-html-entities',
|
||||||
@@ -80,10 +80,10 @@ export const toolList = [
|
|||||||
title: 'Unix 时间戳转换',
|
title: 'Unix 时间戳转换',
|
||||||
iconClass: 'mdi mdi-swap-horizontal',
|
iconClass: 'mdi mdi-swap-horizontal',
|
||||||
desc: '时间戳转时间 / 时间转时间戳',
|
desc: '时间戳转时间 / 时间转时间戳',
|
||||||
createdAt: '',
|
createdAt: '2025-02-05',
|
||||||
updatedAt: '',
|
updatedAt: '2025-02-05',
|
||||||
version: '0',
|
version: '1',
|
||||||
enabled: false,
|
enabled: true,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@@ -1,9 +1,269 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="tool-detail-page"></div>
|
<div class="tool-detail-page">
|
||||||
|
|
||||||
|
<!-- 控制 -->
|
||||||
|
<n-card size="small" title="控制">
|
||||||
|
<n-form
|
||||||
|
class="form-no-feedback form-data"
|
||||||
|
label-align="right"
|
||||||
|
label-placement="left"
|
||||||
|
label-width="9em"
|
||||||
|
>
|
||||||
|
|
||||||
|
<n-form-item label="转换模式:">
|
||||||
|
<n-select
|
||||||
|
v-model:value="data.convertMode"
|
||||||
|
:options="[
|
||||||
|
{ label: '本地时间 -> 时间戳', value: 'toTimestamp' },
|
||||||
|
{ label: '时间戳 -> 本地时间', value: 'toLocalTime' },
|
||||||
|
]"
|
||||||
|
/>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<n-form-item label="时间戳单位:">
|
||||||
|
<n-select
|
||||||
|
v-model:value="data.timestampUnit"
|
||||||
|
:options="[
|
||||||
|
{ label: '毫秒(ms)', value: 'ms' },
|
||||||
|
{ label: '秒(s)', value: 's' },
|
||||||
|
]"
|
||||||
|
/>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<n-form-item label="自动更新:">
|
||||||
|
<n-switch v-model:value="data.autoUpdate" />
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<n-form-item label="操作:">
|
||||||
|
<n-flex>
|
||||||
|
<n-button
|
||||||
|
type="primary"
|
||||||
|
@click="convertTime"
|
||||||
|
>转换</n-button>
|
||||||
|
<n-button
|
||||||
|
type="error"
|
||||||
|
@click="clearInputs"
|
||||||
|
>清空</n-button>
|
||||||
|
</n-flex>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
</n-form>
|
||||||
|
</n-card>
|
||||||
|
|
||||||
|
<!-- 当前 -->
|
||||||
|
<n-card size="small" title="当前">
|
||||||
|
<n-form
|
||||||
|
class="form-no-feedback form-data"
|
||||||
|
label-align="right"
|
||||||
|
label-placement="left"
|
||||||
|
label-width="9em"
|
||||||
|
@contextmenu.stop
|
||||||
|
>
|
||||||
|
|
||||||
|
<n-form-item label="本地时间:">
|
||||||
|
<n-input
|
||||||
|
v-model:value="data.currentLocalTime"
|
||||||
|
placeholder=""
|
||||||
|
type="text"
|
||||||
|
:readonly="true"
|
||||||
|
></n-input>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<n-form-item label="时间戳(ms):">
|
||||||
|
<n-input
|
||||||
|
v-model:value="data.currentTimestamp"
|
||||||
|
placeholder=""
|
||||||
|
type="text"
|
||||||
|
:readonly="true"
|
||||||
|
></n-input>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
</n-form>
|
||||||
|
</n-card>
|
||||||
|
|
||||||
|
<!-- 转换 -->
|
||||||
|
<n-card size="small" title="转换">
|
||||||
|
<n-form
|
||||||
|
class="form-no-feedback form-data"
|
||||||
|
label-align="right"
|
||||||
|
label-placement="left"
|
||||||
|
label-width="9em"
|
||||||
|
@contextmenu.stop
|
||||||
|
>
|
||||||
|
|
||||||
|
<n-form-item label="本地时间:">
|
||||||
|
<n-input
|
||||||
|
v-model:value="data.convertLocalTime"
|
||||||
|
:placeholder="`参考格式:年-月-日 时:分:秒`"
|
||||||
|
:readonly="data.convertMode === 'toLocalTime'"
|
||||||
|
type="text"
|
||||||
|
></n-input>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
<n-form-item label="时间戳:">
|
||||||
|
<n-input
|
||||||
|
v-model:value="data.convertTimestamp"
|
||||||
|
:placeholder="timestampPlaceholder"
|
||||||
|
:readonly="data.convertMode === 'toTimestamp'"
|
||||||
|
type="text"
|
||||||
|
></n-input>
|
||||||
|
</n-form-item>
|
||||||
|
|
||||||
|
</n-form>
|
||||||
|
<n-p>注意:</n-p>
|
||||||
|
<n-p>在“本地时间 -> 时间戳”的模式中,若输入的“本地时间”不包含“时间”部分(例如 2025-02-01),将会加上本地时区与零时区的时差后计算。</n-p>
|
||||||
|
<n-p>即本地时区为北京时间(UTC+8)时按 08:00 计算,本地时区为东京时间(UTC+9)时按 09:00 计算。</n-p>
|
||||||
|
</n-card>
|
||||||
|
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import {
|
||||||
|
NButton, NCard, NCode, NFlex,
|
||||||
|
NForm, NFormItem,
|
||||||
|
NInput, NInputNumber, NP, NSelect, NSwitch,
|
||||||
|
} from 'naive-ui';
|
||||||
|
|
||||||
|
import {
|
||||||
|
computed, reactive,
|
||||||
|
onBeforeMount, onBeforeUnmount,
|
||||||
|
} from 'vue';
|
||||||
|
|
||||||
|
import {
|
||||||
|
$message,
|
||||||
|
} from '@/assets/js/naive-ui';
|
||||||
|
|
||||||
|
import {
|
||||||
|
getCommonDateTime,
|
||||||
|
} from '@frost-utils/javascript/common/index';
|
||||||
|
|
||||||
|
/** 数据 */
|
||||||
|
const data = reactive({
|
||||||
|
autoUpdate: true,
|
||||||
|
convertLocalTime: '',
|
||||||
|
convertMode: 'toTimestamp',
|
||||||
|
convertTimestamp: '',
|
||||||
|
currentLocalTime: '',
|
||||||
|
currentTimestamp: '',
|
||||||
|
timestampUnit: 'ms',
|
||||||
|
timer: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
/** 时间戳输入占位文本 */
|
||||||
|
const timestampPlaceholder = computed(() => {
|
||||||
|
let suffix = (data.timestampUnit === 'ms' ? '000' : '');
|
||||||
|
return '示例:1577808000' + suffix;
|
||||||
|
});
|
||||||
|
|
||||||
|
/** 清空输入内容 */
|
||||||
|
function clearInputs() {
|
||||||
|
data.convertLocalTime = '';
|
||||||
|
data.convertTimestamp = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 转换输入的时间 */
|
||||||
|
function convertTime() {
|
||||||
|
|
||||||
|
let mode = data.convertMode;
|
||||||
|
let unit = data.timestampUnit;
|
||||||
|
|
||||||
|
if (mode === 'toLocalTime') {
|
||||||
|
|
||||||
|
let ts = parseInt(data.convertTimestamp);
|
||||||
|
|
||||||
|
// 检测输入内容
|
||||||
|
if (isNaN(ts)) {
|
||||||
|
$message.warning('请输入时间戳');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转换时间戳为毫秒
|
||||||
|
if (unit === 's') {
|
||||||
|
ts *= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新结果
|
||||||
|
data.convertLocalTime = getCommonDateTime(ts, 'all');
|
||||||
|
|
||||||
|
} else if (mode === 'toTimestamp') {
|
||||||
|
|
||||||
|
let localTime = data.convertLocalTime;
|
||||||
|
let converted = 0;
|
||||||
|
|
||||||
|
if (localTime) {
|
||||||
|
converted = new Date(localTime).getTime();
|
||||||
|
} else {
|
||||||
|
$message.warning('请输入本地时间');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检测输入内容
|
||||||
|
if (isNaN(converted)) {
|
||||||
|
$message.warning('请输入有效的本地时间');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新结果
|
||||||
|
data.convertLocalTime = getCommonDateTime(converted, 'all');
|
||||||
|
|
||||||
|
// 转换时间戳为秒
|
||||||
|
if (unit === 's') {
|
||||||
|
converted = Math.round(converted / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新输入内容
|
||||||
|
data.convertTimestamp = String(converted);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 处理定时器 */
|
||||||
|
function setTimer(isStart = false) {
|
||||||
|
|
||||||
|
if (data.timer) {
|
||||||
|
clearInterval(data.timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isStart) {
|
||||||
|
data.timer = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.timer = setInterval(() => {
|
||||||
|
|
||||||
|
if (!data.autoUpdate) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let currTime = Math.round(Date.now() / 1000) * 1000;
|
||||||
|
let timeText = getCommonDateTime(currTime, 'all');
|
||||||
|
|
||||||
|
data.currentLocalTime = timeText;
|
||||||
|
data.currentTimestamp = String(currTime);
|
||||||
|
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeMount(() => {
|
||||||
|
setTimer(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
setTimer(false);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
.form-data {
|
||||||
|
.n-input {
|
||||||
|
max-width: 256px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.n-select {
|
||||||
|
max-width: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Reference in New Issue
Block a user