From 8a947ef2246eda83aec66ab211d87cbbda1d62b2 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sat, 18 Oct 2025 00:21:43 +0800 Subject: [PATCH] pasting date time from clipboard supports current language date time format --- src/components/desktop/DateTimeSelect.vue | 34 +++++++++++++++++++---- src/lib/datetime.ts | 20 +++++++++++-- src/locales/helpers.ts | 3 ++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/components/desktop/DateTimeSelect.vue b/src/components/desktop/DateTimeSelect.vue index f3b73b5f..08308d84 100644 --- a/src/components/desktop/DateTimeSelect.vue +++ b/src/components/desktop/DateTimeSelect.vue @@ -88,6 +88,7 @@ import { type TimePickerValue, useDateTimeSelectionBase } from '@/components/bas import { ThemeType } from '@/core/theme.ts'; import { NumeralSystem } from '@/core/numeral.ts'; import { + type DateTime, MeridiemIndicator, KnownDateTimeFormat } from '@/core/datetime.ts'; @@ -121,6 +122,8 @@ const theme = useTheme(); const { tt, getCurrentNumeralSystemType, + parseDateTimeFromLongDateTime, + parseDateTimeFromShortDateTime, formatUnixTimeToLongDateTime } = useI18n(); @@ -233,21 +236,42 @@ function onPaste(event: ClipboardEvent): void { return; } - const text = event.clipboardData.getData('Text'); + let text = event.clipboardData.getData('Text'); if (!text) { event.preventDefault(); return; } - const formats = KnownDateTimeFormat.detect(text); + text = text.trim(); - if (!formats || formats.length !== 1) { - event.preventDefault(); + const formats = KnownDateTimeFormat.detect(text); + let dt: DateTime | undefined = undefined; + + if (formats && formats.length === 1) { + dt = parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat); + + if (dt) { + dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())); + return; + } + } + + dt = parseDateTimeFromLongDateTime(text); + + if (dt) { + dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())); return; } - dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat).getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())); + dt = parseDateTimeFromShortDateTime(text); + + if (dt) { + dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes())); + return; + } + + event.preventDefault(); } function onFocused(input: VAutocomplete | null | undefined, focused: boolean): void { diff --git a/src/lib/datetime.ts b/src/lib/datetime.ts index 5a639fa2..5ec4b174 100644 --- a/src/lib/datetime.ts +++ b/src/lib/datetime.ts @@ -558,8 +558,24 @@ export function parseDateTimeFromUnixTime(unixTime: number, utcOffset?: number, return MomentDateTime.of(moment.unix(unixTime)); } -export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime { - return MomentDateTime.of(moment(dateTime, format.format)); +export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime | undefined { + const m = moment(dateTime, format.format); + + if (!m.isValid()) { + return undefined; + } + + return MomentDateTime.of(m); +} + +export function parseDateTimeFromString(dateTime: string, format: string): DateTime | undefined { + const m = moment(dateTime, format); + + if (!m.isValid()) { + return undefined; + } + + return MomentDateTime.of(m); } export function formatUnixTime(unixTime: number, format: string, options: DateTimeFormatOptions, utcOffset?: number, currentUtcOffset?: number): string { diff --git a/src/locales/helpers.ts b/src/locales/helpers.ts index 9aa18959..71b1f3a7 100644 --- a/src/locales/helpers.ts +++ b/src/locales/helpers.ts @@ -188,6 +188,7 @@ import { getCurrentUnixTime, getYearMonthDayDateTime, parseDateTimeFromUnixTime, + parseDateTimeFromString, getGregorianCalendarYearMonthDays, getDateTimeFormatType, getFiscalYearTimeRangeFromUnixTime, @@ -2361,6 +2362,8 @@ export function useI18n() { getCalendarDisplayShortMonthFromUnixTime: (unixTime: number, numeralSystem?: NumeralSystem, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, 'MMM', getDateTimeFormatOptions({ calendarType: getCurrentCalendarDisplayType().primaryCalendarType, numeralSystem: numeralSystem }), utcOffset, currentUtcOffset), getCalendarDisplayDayOfMonthFromUnixTime: (unixTime: number, numeralSystem?: NumeralSystem, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedShortDayFormat(), getDateTimeFormatOptions({ calendarType: getCurrentCalendarDisplayType().primaryCalendarType, numeralSystem: numeralSystem }), utcOffset, currentUtcOffset), // format date time (by date display type) functions + parseDateTimeFromLongDateTime: (dateTime: string) => parseDateTimeFromString(dateTime, getLocalizedLongDateFormat() + ' ' + getLocalizedLongTimeFormat()), + parseDateTimeFromShortDateTime: (dateTime: string) => parseDateTimeFromString(dateTime, getLocalizedShortDateFormat() + ' ' + getLocalizedShortTimeFormat()), formatUnixTimeToLongDateTime: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedLongDateFormat() + ' ' + getLocalizedLongTimeFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset), formatUnixTimeToShortDateTime: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedShortDateFormat() + ' ' + getLocalizedShortTimeFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset), formatUnixTimeToLongDate: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedLongDateFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset),