ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
aviaviלא בפורום כעת ת.הצטרפות: 29/07/2009 · הודעות: 229 ·
 

הודעה פורסם: 13/09/2014 - 19:52
נושא ההודעה: לבדוק אם זמנים חופפים ב-JS

אהלן,
יש לי מערכת לשימור תורים אונליין.
אני צריך לבדוק שכשאדם יוצר תור חדש, הוא לא מתנגש עם תור שכבר קיים במערכת.
זאת אומרת אם מישו שימר תור משעה 12:00 עד 14:00, אין אפשרות לשמר תור
בין השעות 13:00-15:00 (נניח).
יש לי שתי משתנים כשאני קובע תור חדש שהם start ו-end
כשהראשון הוא תחילת התור והשני הוא הסיום.
בוא נניח שאלה אם הערכים של התור החדש
קוד:

start = Wed Sep 10 2014 09:30:00 GMT+0000
end = Wed Sep 10 2014 09:30:00 GMT+0000


איך אוכל לבדוק שהם לא חופפים אם הזמנים האלה?
קוד:

s = Wed Sep 10 2014 07:30:00 GMT+0000
e = Wed Sep 10 2014 08:00:00 GMT+0000


תודה
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
eאורח · ·
 

הודעה פורסם: 13/09/2014 - 22:09
נושא ההודעה:

בהנחה שהמשתנים הם מסוג Date סטנדרטי אז אין שום בעיה להשוות ביניהם בעזרת <> ועם קצת לוגיקה פשוטה להחליט אם הזמנים חופפים.

לטיפול בזמנים ותאריכים ב-js אני נוטה להשתמש בספריה שנקראת momentjs אבל למה שאתה מבקש אני לא חושב שזה נדרש.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
mksoftלא בפורום כעתSite Admin ת.הצטרפות: 17/03/2002 · הודעות: 10514 · מיקום: כדור הארץ
 

הודעה פורסם: 14/09/2014 - 10:46
נושא ההודעה:

עליך להשוות בין הזמנים של התורים שנקבעו לזה שרוצים לקבוע כעת, אם יש חפיפה, גם חלקית, זה תפוס.

נניח תור קיים בשם existing המורכב מ־existingStart ו־existingEnd, ומולו בודקים תור חדש המורכב מ־newStart ו-newEnd.

הדרך המתבקשת לבדוק אם יש חפיפה היא לכסות את המצבים הבאים (אחד מהם מספיק לחפיפה):

  • זמן ההתחלה החדש נמצא בטווח של הקיים
  • זמן הסיום החדש נמצא בטווח של הקיים
  • זמן ההתחלה החדש קטן מזמן התחלה הקיים וזמן הסיום החדש גדול מזמן הסיום הקיים.

לכן:

קוד:
var overlapping = (newStart >= existingStart && newStart <= existingEnd) || (newEnd >= existingStart && newEnd <= existingEnd) || (newStart < existingStart && newEnd > existingEnd);


זה לא כל כך יעיל, ובדיקה טובה יותר מצמצמת את התנאים הנ"ל אל (שניהם צריכים להתקיים):

  • זמן ההתחלה החדש קטן שווה לזמן הסיום הקיים
  • זמן הסיום החדש גדול שווה לזמן ההתחלה הקיים

לכן
קוד:
var overlapping = (newStart <= existingEnd) && (newEnd >= existingStart);


תלוי בדחיסות התורים, יכול להיות שיהיה יעיל יותר לחשב את הזמנים הפנויים בין התורים הקיימים ואז לבדוק אם התור החדש מוכל בתוך הזמנים הפנויים (שים לב: מוכל, לא חופף, גם לא חלקית).

_________________
הבלוג שלי
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית שלח דוא\ ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. aviavi
  2. אורח [e]
  3. mksoft