aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/naive.plugin.ts2
-rw-r--r--src/tools/date-time-converter/date-time-converter.vue111
-rw-r--r--src/tools/date-time-converter/index.ts11
-rw-r--r--src/tools/index.ts3
4 files changed, 126 insertions, 1 deletions
diff --git a/src/plugins/naive.plugin.ts b/src/plugins/naive.plugin.ts
index 86a4617..214b747 100644
--- a/src/plugins/naive.plugin.ts
+++ b/src/plugins/naive.plugin.ts
@@ -44,9 +44,11 @@ import {
NTag,
NInputGroup,
NInputGroupLabel,
+ NDivider,
} from 'naive-ui';
const components = [
+ NDivider,
NInputGroup,
NInputGroupLabel,
NTag,
diff --git a/src/tools/date-time-converter/date-time-converter.vue b/src/tools/date-time-converter/date-time-converter.vue
new file mode 100644
index 0000000..6c17b95
--- /dev/null
+++ b/src/tools/date-time-converter/date-time-converter.vue
@@ -0,0 +1,111 @@
+<template>
+ <div>
+ <n-card>
+ <n-space justify="center">
+ <n-form-item label="Use current date-time ?" label-placement="left" :show-feedback="false">
+ <n-switch v-model:value="useCurrentDate" />
+ </n-form-item>
+ </n-space>
+ <n-form-item :feedback="inputInvalid ? 'Invalid date for the current format' : ''"
+ :validation-status="inputInvalid ? 'error' : undefined">
+ <n-input-group style="flex-grow: 1;">
+ <n-select v-model:value="inputFormat" style="width: 200px;"
+ :options="formats.map(({ name }, i) => ({ label: name, value: i }))"
+ :disabled="useCurrentDate" />
+
+ <n-input v-model:value="inputDate" :on-input="onDateInputChanged" :disabled="useCurrentDate"
+ placeholder="Your date string..." />
+ </n-input-group>
+ </n-form-item>
+ <n-divider style="margin-top: 0;"></n-divider>
+ <div v-for="{ name, fromDate } in formats" :key="name" style="margin: 5px 0;">
+ <n-input-group>
+ <n-input-group-label style="width: 150px;">{{ name }}</n-input-group-label>
+ <n-input :value="fromDate(date)" />
+ </n-input-group>
+ </div>
+ </n-card>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { useRafFn } from '@vueuse/core';
+import { formatISO, formatISO9075, formatRFC3339, formatRFC7231, fromUnixTime, getTime, getUnixTime, isDate, parseISO, parseJSON } from 'date-fns';
+import { ref } from 'vue'
+
+const useCurrentDate = ref(true)
+const inputDate = ref('')
+const inputFormat = ref(6)
+const inputInvalid = ref(false)
+const date = ref(new Date())
+
+useRafFn(() => {
+ if (useCurrentDate.value) {
+ date.value = new Date()
+ }
+})
+
+function onDateInputChanged(value: string) {
+ const { toDate } = formats[inputFormat.value]
+ inputInvalid.value = false
+
+ try {
+ const formatted: Date | string = toDate(value)
+
+ if (!isDate(formatted) || isNaN(formatted.getTime())) {
+ throw 'invalid date'
+ }
+
+ date.value = formatted
+ } catch (_) {
+ inputInvalid.value = true
+ }
+}
+
+const formats = [
+ {
+ name: 'JS locale date string',
+ fromDate: (date: Date) => date.toString(),
+ toDate: (date: string) => new Date(date)
+ },
+ {
+ name: 'ISO 8601',
+ fromDate: (date: Date) => formatISO(date),
+ toDate: (date: string) => parseISO(date)
+ },
+ {
+ name: 'ISO 9075',
+ fromDate: (date: Date) => formatISO9075(date),
+ toDate: (date: string) => parseISO(date)
+ },
+ {
+ name: 'RFC 3339',
+ fromDate: (date: Date) => formatRFC3339(date),
+ toDate: (date: string) => new Date(date)
+ },
+ {
+ name: 'RFC 7231',
+ fromDate: (date: Date) => formatRFC7231(date),
+ toDate: (date: string) => new Date(date)
+ },
+ {
+ name: 'Timestamp',
+ fromDate: (date: Date) => String(getTime(date)),
+ toDate: (ms: string) => parseJSON(+ms)
+ },
+ {
+ name: 'Unix timestamp',
+ fromDate: (date: Date) => String(getUnixTime(date)),
+ toDate: (sec: string) => fromUnixTime(+sec)
+ },
+ {
+ name: 'UTC format',
+ fromDate: (date: Date) => date.toUTCString(),
+ toDate: (date: string) => new Date(date)
+ },
+]
+
+</script>
+
+<style lang="scss" scoped>
+</style> \ No newline at end of file
diff --git a/src/tools/date-time-converter/index.ts b/src/tools/date-time-converter/index.ts
new file mode 100644
index 0000000..36a3c26
--- /dev/null
+++ b/src/tools/date-time-converter/index.ts
@@ -0,0 +1,11 @@
+import { Calendar } from '@vicons/tabler';
+import type { ITool } from '../Tool';
+
+export const tool: ITool = {
+ name: 'Date-time converter',
+ path: '/date-converter',
+ description: 'Convert date and time into the various different formats',
+ keywords: ['date', 'time', 'converter', 'iso', 'utc', 'timezone', 'year', 'mounth', 'day', 'minute', 'seconde'],
+ component: () => import('./date-time-converter.vue'),
+ icon: Calendar,
+};
diff --git a/src/tools/index.ts b/src/tools/index.ts
index 5244f6c..d2dde6e 100644
--- a/src/tools/index.ts
+++ b/src/tools/index.ts
@@ -7,6 +7,7 @@ import { tool as uuidGenerator } from './uuid-generator';
import { tool as romanNumeralConverter } from './roman-numeral-converter';
import { tool as cypher } from './encryption';
import { tool as bip39 } from './bip39-generator';
+import { tool as dateTimeConverter } from './date-time-converter';
export const toolsByCategory: ToolCategory[] = [
{
@@ -17,7 +18,7 @@ export const toolsByCategory: ToolCategory[] = [
{
name: 'Converter',
icon: LockOpen,
- components: [romanNumeralConverter],
+ components: [dateTimeConverter, romanNumeralConverter],
},
];