有没有办法将 hh:mm 的字符串转换为 Javascript 中的日期

Is there a way to cast a string of only hh:mm to Date in Javascript

我在 mongoose 模式中有一个表示日期的营业时间对象。我正在传递一个 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,
      },
    },
  },
}

我知道我可以在保存之前转换它,但是有没有办法解析一个只有 hh:mm 的字符串呢?我似乎找不到办法,或者将它表示为不同的对象会更好,什么对象最适合这种情况。

或者我应该有这样的架构:

我需要小时和分钟用于未来的逻辑。

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

谢谢

使用 "18:30"1830 这样的值并没有太大区别。一个和另一个一样坏。

"18:30" 这样的值是字符串,您不能将它们转换为 Date。如果你喜欢这样做,那么你必须有一个完整的 date/time 字符串,例如“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"       
    }
}

如果您使用工作日名称,那么您将不得不处理 $switch or you need a 3rd party library like moment.js, luxon or Day.js