oktatas:web:back-end_framework:express:datummuveletek_es
Különbségek
A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
oktatas:web:back-end_framework:express:datummuveletek_es [2025/07/28 21:49] – létrehozva admin | oktatas:web:back-end_framework:express:datummuveletek_es [2025/08/01 10:06] (aktuális) – eltávolítva admin | ||
---|---|---|---|
Sor 1: | Sor 1: | ||
- | [[: | ||
- | |||
- | ====== Express - Dátumműveletek ES ====== | ||
- | |||
- | * **Szerző: | ||
- | * Copyright (c) 2025, Sallai András | ||
- | * Licenc: [[https:// | ||
- | * Web: https:// | ||
- | |||
- | ===== Dátum növelése ===== | ||
- | |||
- | Növeljük egy nappal: | ||
- | |||
- | <code javascript> | ||
- | 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. | ||
- | |||
- | <code javascript> | ||
- | const date = new Date(" | ||
- | const today = new Date(); | ||
- | |||
- | console.log(date.getTime()); | ||
- | console.log(today.getTime()); | ||
- | |||
- | if(date.getTime() > today.getTime()) { | ||
- | console.log(" | ||
- | }else { | ||
- | console.log(" | ||
- | } | ||
- | </ | ||
- | |||
- | ===== Hány nap különbség ===== | ||
- | |||
- | <code javascript> | ||
- | const date = new Date(" | ||
- | 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: | ||
- | <code javascript> | ||
- | const today = new Date(); | ||
- | today.setHours(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, | ||
- | * 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. | ||
- | |||
- | |||
- | {{: | ||
- | |||
- | 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:// | ||
- | |||
- | A következő részlet egy kontrollerben helyezhető el, például egy Create művelet esetén. | ||
- | |||
- | |||
- | Implicit ÉS kapcsolattal: | ||
- | |||
- | <code javascript> | ||
- | 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(' | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | Explicit, egyértelműen megadva az és kapcsolat: | ||
- | |||
- | <code javascript> | ||
- | 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(' | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | Csak adott felhasználónál vizsgáljuk: | ||
- | |||
- | <code javascript> | ||
- | 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(' | ||
- | } | ||
- | </ | ||
- | |||
- | ==== Szigorú kizárás ==== | ||
- | |||
- | Szigorú kizárásról beszélünk, | ||
- | lehet újra foglalni. | ||
- | |||
- | <code javascript> | ||
- | 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, | ||
- | vizsgálhatjuk a modellben is. | ||
- | |||
- | |||
- | <code javascript> | ||
- | import { DataTypes } from ' | ||
- | import sequelize from ' | ||
- | |||
- | const Rental = sequelize.define(' | ||
- | id: { | ||
- | type: DataTypes.INTEGER, | ||
- | autoIncrement: | ||
- | 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, | ||
- | endDate.setHours(0, | ||
- | |||
- | const diffInDays = Math.round((endDate - startDate) / (1000 * 60 * 60 * 24)) | ||
- | |||
- | if(diffInDays < 2) { | ||
- | throw new Error(' | ||
- | } | ||
- | if(diffInDays > 20) { | ||
- | throw new Error(' | ||
- | } | ||
- | } | ||
- | } | ||
- | } | ||
- | }, | ||
- | 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; | ||
- | 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:// | ||
- | |||
- | |||
- | ===== A moment csomag használata ===== | ||
- | |||
- | npm init -y | ||
- | npm install moment | ||
- | |||
- | ==== Különbség ==== | ||
- | |||
- | npm init -y | ||
- | |||
- | ES modulhoz a package.json fájlban a type kulcs értéke " | ||
- | |||
- | <code javascript> | ||
- | //ES modulként | ||
- | import moment from " | ||
- | |||
- | const date = new Date(' | ||
- | |||
- | const today = moment().startOf(' | ||
- | const startDate = moment(date).startOf(' | ||
- | |||
- | console.log(today.diff(startDate, | ||
- | </ | ||
- | |||
- | |||
- | CommonJS megoldás: | ||
- | |||
- | <code javascript> | ||
- | const moment = require(" | ||
- | |||
- | const date = new Date(" | ||
- | |||
- | const today = moment().startOf(" | ||
- | const startDate = moment(date).startOf(" | ||
- | |||
- | console.log(today.diff(startDate, | ||
- | </ | ||
- | |||
oktatas/web/back-end_framework/express/datummuveletek_es.1753732195.txt.gz · Utolsó módosítás: 2025/07/28 21:49 szerkesztette: admin