חישוב תאריך...

MotiAd

New member
חישוב תאריך...

שלום לכולם, יש לי בעייה קטנטונת בגלל UNIX. כמו שכולם יודעים יש פונקציות API שמחזירות את מספר השניות שחלפו מאז 1970 ינואר 00:00. עכשיו, אין לי מושג איך לחשב כמה שניות יש בשנה אחת כי אני לא יודע איך לחשב את כמות הימים (365 ורבע?) כל השאר לא בעייתי בשבילי (כמו חישוב מספר הימים בכל חודש וכו). אז מי שמוכון לעזור תודה רבה. בתודה, מוטי.
 

אלדד27

New member
מה המטרה הסופית?

אתה רוצה בסופו של דבר להגיע לתאריך מסוים? נדמה לי שהפונקציות שיש ב - WIN32 עובדות גם תחת UNIX. נסה את strtime למשל.
 

annefan

New member
מספר ימים בשנה

365.25 זה מדויק, אבל לא שייך. אם אני זוכר טוב: בשנה שלא מתחלקת בארבע יש 365 ימים. בשנה שמתחלקת בארבע יש 366 ימים. בשנה שמתחלקת ב-100 יש 365 ימים. בשנה שמתחלקת ב-400 יש 366 ימים. חוץ מזה, אני חושב שיש פונקציות שמקבלות תאריך בפורמט date_d אני חושב (אין לי לינוקס מולי כרגע, ולא זמן לחפש) ומחזירות int או size_t או משהו כזה. תפחית ראשון לינואר בשנת X עם שנת Y וקיבלת מה שרצית.
 

MotiAd

New member
או קיי...

אני מדבר על עבודה תחת WINDOWS. אני מצפה בעצם וזה מה שאני מקבל לקבל תאריך (32BIT באורך) שיכול להיות 2000000015 ולהוציא מזה את התאריך בעצם. ע"י חישובים כמובן. אני עובד תחת VB.NET אבל אין לי בעייה לגישה ל-API או כל דבר אחר. תודה, מוטי.
 

annefan

New member
אני לא מבין

התחלת מלינוקס (1.1.1970) וסיימת בחלונות ולא ב-C אלא ב-VB. אתה יכול להסביר בבקשה מה אתה מקבל כקלט (יש ב-VB, אם אני זוכר טוב, יש פונקציות כמו DateSerial שממירות בין צורות שונות של תאריכים, וכן DateTime). אם אתה מקבל מספר שניות, מי אמר לך שהן נמנות מהאפוך כמו בלינוקס? לפי התיעוד, VB מונה טיקים שהם מאיות שניה מתחילת הספירה הנוצרית ולא מ-1970. יש גם מבנה אחר של 32 ביט המייצג תאריך, אך אינו קשור למספר שניות. בקיצור, תסביר עוד בבקשה.
 

אלדד27

New member
וזה נכון גם לגבי 1000, כלומר

שנת 2000 למשל הייתה שנה "רגילה" ולא מעוברת.
 

MotiAd

New member
הסבר...

בזכות UNIX (בלי לזלזל) בחלק ממערכות המחשבים סופרים את התאריך כאילו התחיל מינואר 1970 00:00. עכשיו לבעייתי - אני מקבל כחלק מפונקציית API שדה מסויים שמכיל מספר באורך 32 ביט. המספר מציין את מספר השניות שחלפו מאז השנה המצויינת לעיל. אני צריך להפוך את זה לתאריך בפורמט של DD/MM/YYYY והשעה וכל זה אני צריך איכשהו לחלץ מהמספר הזה. נתקעתי בחילוץ השנה כי אין לי מושג כמה שניות יש בשנה או איך לחשב את זה ע"פ השנה (ע"פ שנה שפברואר ארוך יותר או לא וכו). בתודה, מוטי.
 

MotiAd

New member
תוספת קטנה...

אני גם לא בטוח לגבי הזמן בכל יום (24 שעות או 23 ו3/4 שעות?)
 

annefan

New member
כבר אמרתי

כמה שניות יש מ-12 עד 12 למחרת? 86400, בלי רבעים וכדומה. ההגיון הוא שהשנים המעוברות הנ"ל מפצות על כל השברים. אמנם לא מדויק כמו הלוח העברי, אבל מספיק טוב לצרכינו.
 

annefan

New member
שתי דרכים

א. תבנה פונקציה שמחשבת כמה שניות יש בשנה נתונה לפי התנאים שכתבתי, תפחית מהמשתנה את מספר השניות, ותבדוק האם ירדת מתחת לאפס או לא. כנ"ל לגבי חודשים, ימים, שעות ודקות. ב. days = seconds / 60 / 60 / 24 today = DateSerial(70, 1, 1) + days
 

annefan

New member
אני חושש שאתה טועה

שנת 2000, לפחות לפי האינטרנט ולפי חלונות 2000 היתה מעוברת.
 

אלדד27

New member
אתה צודק, היא אכן הייתה מעוברת,

טעות שלי. מצד שני, אני זוכר משהו כזה לגבי 1000. מוזר... אני אבדוק.
 

MotiAd

New member
אז...

מה שאני אעשה זה לחשב ע"פ פונקציה נתונה (נניח שקיימת ב-VB) כמה ימים היו בשנה מסויימת ואת התוצאה להכפיל ב-86400 (מספר השניות בכל יום) וכך להפחית את זה מהמספר שאני מקבל?... תודה, מוטי.
 

galh

New member
ככה זה שהשנה לא נזהרת...

הביטוי לבדיקה שנה מעוברת:
((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))​
זה מסביר למה 2000 הייתה מעוברת (מתחלקת ל- 4 ו- 400).
 

MotiAd

New member
100% אבל אני לא מתכנת ב-C...

וחבל שכך (לשמחתי הרבה)
 

DNile

New member
אלא???

זה עדיין לא ברור באיזה שפה אתה משתמש...
 

annefan

New member
הוא מתכנת ב-VB.NET

(כתוב באחת מההודעות שלו). נתתי לו תשובה.
 
למעלה