From 7e5e4d00eea8b74df0f3f835fb4a5d8c3162b56c Mon Sep 17 00:00:00 2001 From: poros Date: Tue, 21 Jan 2025 17:55:05 +0100 Subject: [PATCH] add objectid util functions --- .../date-time-converter.models.ts | 2 -- .../date-time-converter.vue | 7 +++--- src/utils/objectId.ts | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 src/utils/objectId.ts diff --git a/src/tools/date-time-converter/date-time-converter.models.ts b/src/tools/date-time-converter/date-time-converter.models.ts index f5eedbfa..1af863f6 100644 --- a/src/tools/date-time-converter/date-time-converter.models.ts +++ b/src/tools/date-time-converter/date-time-converter.models.ts @@ -8,7 +8,6 @@ export { isUnixTimestamp, isTimestamp, isUTCDateString, - isMongoObjectId, dateToExcelFormat, excelFormatToDate, isExcelFormat, @@ -36,7 +35,6 @@ const isRFC3339DateString = createRegexMatcher(RFC3339_REGEX); const isRFC7231DateString = createRegexMatcher(RFC7231_REGEX); const isUnixTimestamp = createRegexMatcher(/^[0-9]{1,10}$/); const isTimestamp = createRegexMatcher(/^[0-9]{1,13}$/); -const isMongoObjectId = createRegexMatcher(/^[0-9a-fA-F]{24}$/); const isExcelFormat = createRegexMatcher(EXCEL_FORMAT_REGEX); diff --git a/src/tools/date-time-converter/date-time-converter.vue b/src/tools/date-time-converter/date-time-converter.vue index 5636ed46..52181e5b 100644 --- a/src/tools/date-time-converter/date-time-converter.vue +++ b/src/tools/date-time-converter/date-time-converter.vue @@ -28,6 +28,7 @@ import { } from './date-time-converter.models'; import { withDefaultOnError } from '@/utils/defaults'; import { useValidation } from '@/composable/validation'; +import { isValidObjectId, objectIdFromDate, objectIdToDate } from '@/utils/objectId'; const inputDate = ref(''); @@ -84,9 +85,9 @@ const formats: DateFormat[] = [ }, { name: 'Mongo ObjectID', - fromDate: date => `${Math.floor(date.getTime() / 1000).toString(16)}0000000000000000`, - toDate: objectId => new Date(Number.parseInt(objectId.substring(0, 8), 16) * 1000), - formatMatcher: date => isMongoObjectId(date), + fromDate: date => objectIdFromDate(date.getTime(), true), + toDate: objectIdToDate, + formatMatcher: date => isValidObjectId(date), }, { name: 'Excel date/time', diff --git a/src/utils/objectId.ts b/src/utils/objectId.ts new file mode 100644 index 00000000..076e81a7 --- /dev/null +++ b/src/utils/objectId.ts @@ -0,0 +1,24 @@ +import _ from 'lodash'; + +export function isValidObjectId(objectId?: string): boolean { + return !_.isNil(objectId) && /^[0-9a-fA-F]{24}$/.test(objectId); +} + +export function objectIdToDate(objectId: string): Date { + return new Date(Number.parseInt(objectId.substring(0, 8), 16) * 1000); +} + +export function objectIdFromDate(milliseconds: number, onlyDate: boolean = false): string { + const suffixReplacer = () => { + if (onlyDate) { + return '0'; + } + + return (Math.random() * 16 | 0).toString(16); + }; + + const timestamp = (milliseconds / 1000 | 0).toString(16); + const suffix = 'xxxxxxxxxxxxxxxx'.replace(/[x]/g, suffixReplacer).toLowerCase(); + + return `${timestamp}${suffix}`; +}