[[:oktatas:web:back-end_framework:express|< Express]] ====== Express - Dátumműveletek ====== * **Szerző:** Sallai András * Copyright (c) 2025, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Dátum növelése ===== Növeljük egy nappal: const today = new Date(); console.log(today); today.setDate(today.getDate() + 1); console.log(today); ===== Dátum összehasonlítása ===== Kérjük le a számként, majd így hasonlítsuk. const date = new Date("2025-04-23"); const today = new Date(); console.log(date.getTime()); console.log(today.getTime()); if(date.getTime() > today.getTime()) { console.log("Nagyobb"); }else { console.log("Kisebb"); } ===== Hány nap különbség ===== const date = new Date("2025-04-22"); const today = new Date(); const diff = today - date; const days = Math.floor(diff / 1000 / 60 / 60 / 24); console.log(days); ===== Idő ===== Idő nullázása: const today = new Date(); today.setHours(0, 0, 0, 0); console.log(today); ===== Átfedésvizsgálat ===== Legyen 3 foglalás. Adott két meglévő foglalás: * 3-tól 5-ig * 7-től 9-ig Szeretnénk 5-től 7-ig foglalni. A másik lehetőség, hogy a meglévő foglalások: * 3-tól 5-ig * 9-től 11-ig Amit szeretnénk foglalni: 6-tól 8-ig. Lássuk a következő ábrán. {{:oktatas:web:back-end_framework:express:ido_atfedes.png|}} Az alábbiakban szállodai foglalásra látunk példát. Ha április 5-én elmegy egy vendég, akkor 5-től már lehet foglalni. A Sequelize ORM lekérdezési és operátorhasználati lehetőségeit használjuk, amelyről többet olvashatsz itt: * https://sequelize.org/docs/v6/core-concepts/model-querying-basics/ (2025) A következő részlet egy kontrollerben helyezhető el, például egy Create művelet esetén. Implicit ÉS kapcsolattal: const { startDate, endDate } = req.body const overlappingRental = await Rental.findAll({ where: { startDate: { [Op.lt]: endDate }, endDate: { [Op.gt]: startDate } } }) if(overlappingRental.length > 0) { throw new Error('Hiba! Átfedés a foglalásban!') } Explicit, egyértelműen megadva az és kapcsolat: const { startDate, endDate } = req.body const overlappingRental = await Rental.findAll({ where: { [Op.and]: [ { startDate: { [Op.lt]: endDate } }, { endDate: { [Op.gt]: startDate } } ] } }) if(overlappingRental.length > 0) { throw new Error('Hiba! Átfedés a foglalásban!') } Csak adott felhasználónál vizsgáljuk: const { userId, startDate, endDate } = req.body const overlappingRental = await Rental.findAll({ where: { userId: userId, [Op.and]: [ { startDate: { [Op.lt]: endDate } }, { endDate: { [Op.gt]: startDate } } ] } }) if(overlappingRental.length > 0) { throw new Error('Hiba! Átfedés a foglalásban!') } ==== Szigorú kizárás ==== Szigorú kizárásról beszélünk, amikor április 5-ig van foglalva valami, és csak másnaptól lehet újra foglalni. where: { [Op.and]: [ { startDate: { [Op.lte]: endDate } }, { endDate: { [Op.gte]: startDate } } ] } ===== Minimum és maximum napok száma ===== Legyen egy foglalás, ahol minimum 3 napot, maximum 21 napot foglalhatunk. Mivel nem szükséges lekérdezést végezni az adatbázisból, ezért az ilyen érvényességet vizsgálhatjuk a modellben is. import { DataTypes } from 'sequelize' import sequelize from '../database/database.js' const Rental = sequelize.define('rental', { id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, userId: { type: DataTypes.STRING, allowNull: false, validate: { len: [1,] } }, startDate: { type: DataTypes.DATE, allowNull: true, validate: { isDate: true } }, endDate: { type: DataTypes.DATE, allowNull: true, validate: { isDate: true, checkDateRange(value) { if(this.startDate && value) { const startDate = new Date(this.startDate) const endDate = new Date(value) startDate.setHours(0, 0, 0, 0) endDate.setHours(0, 0, 0, 0) const diffInDays = Math.round((endDate - startDate) / (1000 * 60 * 60 * 24)) if(diffInDays < 2) { throw new Error('Hiba! A bérlés időtartalma legalább 3 nap') } if(diffInDays > 20) { throw new Error('Hiba! A bérlés maximum 21 nap') } } } } }, duration: { type: DataTypes.VIRTUAL, get() { if (this.endDate && this.startDate) { const millisecondsPerDay = 1000 * 60 * 60 * 24; return Math.floor((this.endDate - this.startDate) / millisecondsPerDay); } return null; } }, totalCost: { type: DataTypes.VIRTUAL, get() { let total = 0 if (this.rentalItems) { for(let i = 0; i < this.rentalItems.length; i++) { total += this.rentalItems[i].dailyPrice * this.duration } } return total } } }) sequelize.sync({ force: false }) export default Rental A duration és a totalCost mezők számított mezők, amelyeket virtuális mezőként hoztunk létre. Ezekről többet olvashatsz A Sequelize dokumentációjában: * https://sequelize.org/docs/v6/core-concepts/getters-setters-virtuals/ (2025) ===== A moment csomag használata ===== npm init -y npm install moment ==== Különbség ==== const moment = require("moment"); const date = new Date("2025-04-22"); const today = moment().startOf("day"); const startDate = moment(date).startOf("day"); console.log(today.diff(startDate, "days"));