הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   PHPאיך לוקחים יום אחורה מתאריך מסויים? (https://hosts.co.il/forums/showthread.php?t=93255)

trupix 05-11-11 18:08

PHPאיך לוקחים יום אחורה מתאריך מסויים?
 
הי

דיסקסתי כבר פה על משהו דומה. אני גרוע בכל העסק הזה של התאריכים|קורץ|

בכל אופן, כיצד ניתן לדעת מהו יום אחד לפני התאריך x?
יש לציין כי התאריך הנוכחי יהיה:
קוד:

$now = GET["date"];
לדוגמא, אם now=1.1.11, אני רוצה שתיהיה תוצאה של יום אחד לפני

רב תודות ושבוע טוב

Tal. 05-11-11 19:28

PHP קוד:

$Nnow=strtotime($now);

$yesterday=date('d-m-Y',strtotime('-1 day',$Nnow)); 


trupix 05-11-11 23:44

הי,

הקוד לא עובד

אין שגיאה, אבל הקוד לא מזהה שהתאריך הנוכחי הוא זה שהזנתי

ציטוט:

נכתב במקור על ידי Youtube4Down.com (פרסם 824156)
PHP קוד:

$Nnow=strtotime($now);

$yesterday=date('d-m-Y',strtotime('-1 day',$Nnow)); 



עריכה:
אוקי הבנתי למה. צריך להזין 2011 במקום 11. אבל זה לא כל כך טוב לי משום שבאתר אני משתמש בתאריך המקוצר (j.n.y)

זה לא עובד:
PHP קוד:

$now=strtotime("1.11.11");
$yesterday=date('j.n.y',strtotime('-1 day',$now));  

echo 
$yesterday
//הפלט - 4.11.11 

אולם כשאני מציב 2011 במקום 11, זה כן עובד
מה אפשר לעשות?

אדיר 06-11-11 01:01

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

הפתרון הפשוט והיעיל ביותר הוא לעבוד עם timestamps,
ברגע שאתה עובד עם timestamp אתה יכול להמיר אותו להציג אותו בכל צורה שתרצה -
כאן עם שנה ב- 2 ספרות, שם עם שנה ב- 4 ספרות ובמקום אחר אפילו בלי שנה בכלל, ממש איך שמתאים לך ואיפה שמתאים לך.

trupix 06-11-11 01:02

אתה מתכוון עם פונקציית הtimestamp בMYSQL?

אדיר 06-11-11 01:07

אם התאריך נשמר במסד, אז כן.
אתה יכול ליצור שדה מסוג TIMESTAMP, להגדיר לו ערך ברירת מחדל כ- CURRENT_TIMESTAMP, וברגע הזנת הנתונים לא להכניס לו כלום והוא ימלא את השדה הזה לבד.
עכשיו כל פעם שאתה רוצה להציג את התאריך, אתה יכול לשלוף אותו לבצע את ההמרה ב- PHP, או לשלוף אותו ישר בפורמט שאתה רוצה באמצעות הפונקציה DATE_FORMAT ב- MySQL.

trupix 06-11-11 01:09

אוקי תודה..

Tal. 06-11-11 01:34

בטח שהוא לא קיבל שנה בשני ספרות. זה מחשב, אולי לך זה נראה ברור שכשאתה רושם 11 אתה מתכוון ל2011 אבל בשביל המחשב יכול כל שנה (שנגמרת ב11).
בתור פלט זה לא בעיה שני ספרות - הוא פשוט מוריד את 2 הספרות הראשונות, בתור קלט זה בלתי אפשרי.

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

אתה יכול "להמיר" את זה לבד, פשוט אם השנה קטנה מ50 תוסיף '20' לשנה אם גדולה תוסיף 19.
נכון זה פתרון לא מקצועי אבל כבר לשלוח שנה בשני ספרות זה לא מקצועי. מקסימום יהיה לך באג 3000, בקטנה. :)

תדע לעבוד תמיד עם שנה ב4 ספרות.

trupix 06-11-11 02:01

חח אני מניח שאתה צודק חבריקו

|קורץ|

ציטוט:

נכתב במקור על ידי Youtube4Down.com (פרסם 824204)
בטח שהוא לא קיבל שנה בשני ספרות. זה מחשב, אולי לך זה נראה ברור שכשאתה רושם 11 אתה מתכוון ל2011 אבל בשביל המחשב יכול כל שנה (שנגמרת ב11).
בתור פלט זה לא בעיה שני ספרות - הוא פשוט מוריד את 2 הספרות הראשונות, בתור קלט זה בלתי אפשרי.

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

אתה יכול "להמיר" את זה לבד, פשוט אם השנה קטנה מ50 תוסיף '20' לשנה אם גדולה תוסיף 19.
נכון זה פתרון לא מקצועי אבל כבר לשלוח שנה בשני ספרות זה לא מקצועי. מקסימום יהיה לך באג 3000, בקטנה. :)

תדע לעבוד תמיד עם שנה ב4 ספרות.


אדיר 06-11-11 02:34

Youtube4Down.com:
"המחשב" כפי שאתה מתאר יכול ויודע לקבל שנה ב- 2 ספרות בלי שום בעיה - כל עוד זה מתוכנן להיות כך.
הוא לא מוריד 2 ספרות מההתחלה - הוא יודע לעבוד ככה וזהו.

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

הפתרון המקובל והפתרון האידיאלי היא הפתרון שציינתי,
כשיש לך חותמת זמן (timestamp), אין פה שום מקום לטעויות - אתה יכול להציג אותה איך שבא לך בלי שום חישובים והמרות מיותרות כמו זו שציינת.

Tal. 06-11-11 06:04

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 824209)
Youtube4Down.com:
"המחשב" כפי שאתה מתאר יכול ויודע לקבל שנה ב- 2 ספרות בלי שום בעיה - כל עוד זה מתוכנן להיות כך.
הוא לא מוריד 2 ספרות מההתחלה - הוא יודע לעבוד ככה וזהו.

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

הפתרון המקובל והפתרון האידיאלי היא הפתרון שציינתי,
כשיש לך חותמת זמן (timestamp), אין פה שום מקום לטעויות - אתה יכול להציג אותה איך שבא לך בלי שום חישובים והמרות מיותרות כמו זו שציינת.




וואלה? "יודע לעבוד ככה וזהו"? אתה יודע ששפות תכנות לא ירדו מהשמים?
ישבו בני אדם וכתבו אותם.. יש לך דרך לדעת כשאני מכניס 50 לאיזה שנה אני מתכוון? (לצורך דוגמה)

אתה יותר ממוזמן להראות בכל שפה שתרצה קוד שממיר שנה מ2 ספרות לשנה מ4 ספרות.

ואם כבר אנחנו מדברים על זה, יצא לך לחשוב פעם איך מחשבים RANDOM? הרי מחשב לא יכול פשוט לזרוק מספר..

אדיר 06-11-11 08:23

ציטוט:

נכתב במקור על ידי Youtube4Down.com (פרסם 824211)
וואלה? "יודע לעבוד ככה וזהו"? אתה יודע ששפות תכנות לא ירדו מהשמים?
ישבו בני אדם וכתבו אותם.. יש לך דרך לדעת כשאני מכניס 50 לאיזה שנה אני מתכוון? (לצורך דוגמה)


אתה יותר ממוזמן להראות בכל שפה שתרצה קוד שממיר שנה מ2 ספרות לשנה מ4 ספרות.

ואם כבר אנחנו מדברים על זה, יצא לך לחשוב פעם איך מחשבים RANDOM? הרי מחשב לא יכול פשוט לזרוק מספר..

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

אפשר לעבוד עם שנה ב- 2 ספרות בלי שום בעיה, בדגש - במקומות שמוגדרים לעבוד ככה.
כמו שאני אומר, וכמו שאתה אומר, במקרה הזה אי אפשר - כי הפונקציה לא מוגדרת לקבל את התבנית הזאת.

איך אפשר לעבוד ככה? אסביר לך עכשיו.
ב- PHP ישנן פונקציות שמקבלות שנה ב- 2 ספרות, איך הן יודעות את 2 הספרות הראשונות?
התבנית פשוטה -
עבור ערך בין 0-69, זה נחשב כ- 20xx,
עבור ערך בין 70-99, זה נחשב כ- 19xx.
עכשיו זה קצת יותר ברור לך?

כמובן שלא ניתן להמיר בצורה מדוייקת ובטוחה ב- 100% שנה מ- 2 ספרות ל- 4 ספרות, אני לא מתווכח עם עובדות,
כן ניתן לעבוד עם 2 ספרות, PHP מסוגלת ויודעת לעבד את המידע הזה והיא תתייחס אליו בצורה שציינתי למעלה,
לדעתך זה לא בסדר לעבוד ככה? אתה לא חייב, אני גם מעדיף שלא ואני עובד בד"כ עם timestamp כמו שציינתי ואציין שוב.


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


כל הזמנים הם GMT +2. הזמן כעת הוא 20:42.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ