Есть ли способ привести строку только чч: мм к дате в Javascript

У меня есть объект рабочих часов в схеме мангуста, который представляет дату. Я передаю объект json и извлекаю его для анализа в Date как строку. Интересно, можете ли вы или будет лучше представить его как другой тип объекта. Ошибка, которую я получаю при передаче следующим образом: проверка не удалась: business.businessHours.monday.startTime: не удалось преобразовать дату для значения «08:00» (строка типа)

Обходным решением будут сеттеры, которые добавят текущую дату с часами и минутами:

date.setHours(08);
date.setMinutes(30);

Я чувствую, что есть лучший способ сделать это. Есть ли способ передать объект даты в json?

мой json:

{
  ...,
  "businessHours":{
            "monday": {
                "startTime": "08:00",
                "endTime": "18:30"
            },
            "tuesday": {
                "startTime": "08:00",
                "endTime": "18:30"
            },
            "wednesday": {
                "startTime": "08:00",
                "endTime": "18:30"
            },
            "thursday": {
                "startTime": "08:00",
                "endTime": "18:30"
            },
            "friday": {
                "startTime": "08:00",
                "endTime": "18:30"
            },
            "saturday": {
                "startTime": null,
                "endTime": null
            },
            "sunday": {
                "startTime": null,
                "endTime": null
            }
        }
}

Схема выглядит так:

const sellerSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    unique: true,
  },
  ...,
business: {
  businessHours: {
    monday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    tuesday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    wednesday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    thursday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    friday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    saturday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
    sunday: {
      startTime: {
        type: Date,
      },
      endTime: {
        type: Date,
      },
    },
  },
}

Я знаю, что могу преобразовать его, прежде чем сохранить, но есть ли способ проанализировать строку только с датой в формате чч: мм? Я не могу найти способ, или было бы лучше просто представить его как другой объект и какой объект был бы идеальным для этого случая.

или у меня должна быть схема вроде:

Мне нужны часы и минуты для будущей логики.

const sellerSchema = new mongoose.Schema({
  ...,
  business: {
    businessHours: {
      monday: {
        startTime: Number, //which will be represented as HHMM
        endTime: Number, //which will be represented as HHMM
      },
    },
  },
});

Спасибо

разобрать строку только с чч: мм на сегодняшний день? - в какой день в истории/будущем вы хотели бы оказаться?
Caius Jard 05.05.2022 20:30

Все, что я хочу сэкономить, это часы и минуты для представления рабочих часов. Я подумываю изменить свою схему, чтобы она содержала число, которое будет представлено в виде ЧЧММ, например, 0830, что будет 08:30. Чтобы убедиться, что бронирование не менее 8:30 утра. Просто не уверен, что это будет идеально или даже строка для "08:30"

Jerry310 05.05.2022 20:51

Строка будет работать, но, возможно, будет неудобна для других операций. Просто выберите день, любой день, чтобы сохранить как часть даты

Caius Jard 05.05.2022 21:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не имеет большого значения, используете ли вы такие значения, как "18:30" или 1830. Один такой же плохой, как и другой.

Такие значения, как "18:30", являются строками, их нельзя преобразовать в Date. Если вам нравится это делать, у вас должна быть полная строка даты/времени, например. "2022-05-06T18:30:00". Однако вы должны никогда хранить значения даты в виде строки, это недостаток дизайна. Храните всегда правильные Date объекты!

Использование названий дней недели также является плохой идеей, MongoDB изначально не поддерживает (локализованные) названия дней недели. Кроме того, использование динамических имен полей — плохой дизайн.

Я бы предложил этот:

{ 
   businessHours: [
      { dayOfWeek: 1, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 },
      { dayOfWeek: 2, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 },
      ...
      { dayOfWeek: 5, startHour: 8, startMinute: 0, endHour: 18, endMinute: 30 }
   ] 
}

Согласно ISO-8601 неделя начинается в понедельник, поэтому dayOfWeek: 1 означает понедельник.

Затем вы можете легко создавать из него значения Date, например, так:

{
    $dateFromParts : {
        'isoWeekYear': {$isoWeekYear: "$$NOW"}, 
        'isoWeek': {$isoWeek: "$$NOW"}, 
        'isoDayOfWeek': "$dayOfWeek",
        'hour': "$startHour", 
        'minute': "$startMinute"       
    }
}

Если вы используете названия дней недели, вам придется иметь дело с $ переключатель или вам понадобится сторонняя библиотека, такая как момент.js, Луксон или Day.js.

Другие вопросы по теме