שְׁאֵלָה:
המרה אל חותמת הזמן של יוניקס וממנה
Dzung Nguyen
2017-05-24 21:59:34 UTC
view on stackexchange narkive permalink

מהי הדרך הטובה ביותר להמיר בין תאריך, שעות, דקה, שניות לחותמת זמן של יוניקס באלפיות השנייה בארדואינו? אני צריך לבצע את ההמרה הזו, מכיוון שאני משתמש ב- RTC (תאריך, שעות, דקות, שניות וכו ') ומתקשר עם חותמת הזמן של יוניקס דרך BLE

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

  בתים שנייה = עידן% 60; תקופה / = 60; דקה בתים = עידן% 60; תקופה / = 60; שעת בתים = עידן% 24; תקופה / = 24; שנים int לא חתומות = עידן / (365 * 4 + 1) * 4; תקופה% = 365 * 4 + 1; שנה לא חתומה; עבור (שנה = 3; year>0; שנה--) {אם (תקופה > = ימים [שנה] [0]) הפסקה; } חודש לא חתום; עבור (חודש = 11; חודש>0; חודש--) {אם (תקופה > = ימים [שנה] [חודש]) הפסקה; } שנה = שנים + שנה; חודש = חודש + 1; יום int חתום לא חתום = תקופה - ימים [שנה] [חודש] +1; יום חול לא חתום int = (dayOfMonth + = month < 3? year--: year - 2, 23 * month / 9 + dayOfMonth + 4 + year / 4- year / 100 + year / 400)% 7;  

וכדי להמיר לחותמת זמן של יוניקס:

  תקופה ארוכה לא חתומה = (((שנה / 4 * (365 * 4 + 1) ) + ימים [שנה% 4] [חודש] + dayOfMonth) * 24 + שעה) * 60 + דקה) * 60 + שנייה;  

האם יש ספרייה בארדואינו שמיישמת זאת? הייתי מחליף אמינות על פני גודל התוכנית.

ארבע תשובות:
Jot
2017-05-24 22:20:05 UTC
view on stackexchange narkive permalink

אני חושב ששתי הספריות הנפוצות ביותר הן Adafruit RTClib ו- pjrc.com TimeLib. לשניהם יש פונקציות להמיר את התקופה, ושניהם אמינים . אבל לשניהם אין את אזור הזמן ואת DaylightSavingTime. אני חושב שאתה מוצא את ה- pjrc.com TimeLib מעט יותר מתאים להתמודד עם זמן העידן (שהוא זמן לא חתום של 32 סיביות המוגדר כ- 'time_t').

+1 עבור TimeLib. אני משתמש בו כל הזמן לחותמות זמן של יוניקס.
Edgar Bonet
2017-05-24 23:29:31 UTC
view on stackexchange narkive permalink

קיימת דרך סטנדרטית לבצע המרות אלה ב- C, אשר באמצעות הפונקציות המוגדרות ב- <time.h> . ממשק API זה הוא סטנדרטי, ותוכל לבדוק אותו במחשב שלך. הגרסאות האחרונות של ה- avr-libcs ​​תומכות בכך: ראה time.h ב- avr-libc. פונקציות אלה יכולות לבצע זמן מקומי ידני אם אתה מספק פונקציה המיישמת את כללי ה- DST: ראה set_dst () . ניתן דוגמאות לכללי ארה"ב והאיחוד האירופי.

מדהים, לא ידעתי ש- 'time.h' עם אזור הזמן וגם DST נכללו בארדואינו. תודה. לחבר שבב RTC למערכת זמן זו לצערנו לא נחמד. בכל שנייה יש לקרוא ל- system_tick (). אני פשוט נשאר עם ה- TimeLib של pjrc.com לעת עתה.
@Jot זה לא לגמרי נכון. אתה יכול להשתמש ב- RTC כדי להגדיר את השעון הפנימי של Arduino, ואז להתקשר לשעון הפנימי לקבלת מידע זמן נדרש ... RTC במקרה זה הוא רק שעון מגובה סוללה המשמש מדי פעם ... פעם בכל אתחול מחדש ואולי בכל שבוע-שבועיים. לתיקון סחף.
Ivan
2019-07-29 13:49:41 UTC
view on stackexchange narkive permalink

הנה דוגמה להמרת שניות (זמן יוניקס) לתאריך & Time באמצעות TimeLib.h:

  #include <TimeLib.h>unsigned long offset_days = 3; // 3 ימים t_unix_date1 ארוך, t_unix_date2; הגדרת חלל () {Serial.begin (115200); t_unix_date1 = 1564398600; Serial.print ("t_unix_date1:"); Serial.println (t_unix_date1); offset_days = offset_days * 86400; // להמיר את מספר הימים לשניות t_unix_date2 = 1564398600 + offset_days; Serial.print ("t_unix_date2:"); Serial.println (t_unix_date2); printf ("תאריך 1:% 4d-% 02d-% 02d% 02d:% 02d:% 02d \ n", שנה (t_unix_date1), חודש (t_unix_date1), יום (t_unix_date1), שעה (t_unix_date1), דקה (t_unix_date1), שני (t_unix_date1)); printf ("תאריך 2:% 4d-% 02d-% 02d% 02d:% 02d:% 02d \ n", שנה (t_unix_date2), חודש (t_unix_date2), יום (t_unix_date2), שעה (t_unix_date2), דקה (t_unix_date2), שנייה (t_unix_date2));} לולאה בטלה () {}  
dannyf
2017-05-25 00:47:46 UTC
view on stackexchange narkive permalink

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

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

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


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...