Note that there are some explanatory texts on larger screens.

plurals
  1. PODay month and year algorithm using Gettimeofday() in C
    primarykey
    data
    text
    <p>Im required as part of a lab to devise a way to calculate the current month day and year. I'll be using the gettimeofday() function which gives me the number of seconds since january 1 1970.</p> <p>I know that there are functions that will do the conversoins for me, however the design requirement is that i create my own algorithm for converting the seconds to months days and years. The manner in which I want to implement my design is with a lookup table for each of the twelve months and the corresponding number of days. The logic is a little befuddling to me right now.</p> <p>The tricky part is handling the leap years. I know that 1972 is the first leap year since 1970. And a leap year occurs every 4 years since that date. The hint given to me in this assignment is that the next largest cycle after days is 4 years. So if I modulus the number of days since 1970 by 1461 (number of days in 4 years) I know I can get the number of days left over. Its at this point my train of logic gets lost. If I DIVIDE it by 1461 it just tells me the how many 4 year periods have gone by. </p> <p>The table I want to implement will look something like this ( i know the coding isnt completely right but just to show what im getting at):</p> <pre><code>struct Monthdays { int days; char* Monthname[] }; Monthdays lookupMonths[] { {31,"January"} {28,"February"} . . . }; </code></pre> <p>Im trying to figure out how to create a proper index using the number of days or something to walk through this "table".........I hope asking this here is okay. I've been struggling with the logic or a couple of days right now....</p> <p>Here is the code for this problem i have now which is very inefficient.</p> <pre><code> ExpandedTime* localTime( struct timeval* tv, // Pointer to timeval struct ExpandedTime* etime // '' '' to expandedtime strct ) { tzset(); // Corrects for timezone int epochT = (tv-&gt;tv_sec) - timezone; // Epoch seconds with int epochUT = tv-&gt;tv_usec; // epochtime microseconds int edays; // Days since epochtime etime-&gt;et_usec = (epochUT/milli) % milli; // Find the milliseconds etime-&gt;et_sec = epochT % 60; epochT /= 60; // Turn into minutes etime-&gt;et_min = epochT % 60; epochT /= 60; // Turn into hours if (localtime(&amp;tv-&gt;tv_sec)-&gt;tm_isdst !=0) etime-&gt;et_hour = (epochT % 24) + daylight; // Hours with DST correc else etime-&gt;et_hour = (epochT % 24); edays = epochT /= 24; // Turn into days etime-&gt;et_day = epochT; // Delete up to here etime-&gt;et_year = (epochT/365) + epochyear; // Get the current year int trackyear; // Counter for years int trackdays = -1; // Subtracting janurary 1st // from days // This will determine if it is a leapyear and adjust days accordingly // from 1970 to current year (2013) for (trackyear = epochyear; trackyear &lt; etime-&gt;et_year; trackyear++) { if (trackyear % leapy == 0) { trackdays = trackdays + 366; } else { trackdays = trackdays + 365; } } etime-&gt;et_day = edays - trackdays; int trackmonth = -1; // Counter for months // with offset to make // january = 0 // This will give me the number of months for the buffer do { switch (trackmonth) { // Months with 31 days case 0: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 2: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 4: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 6: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 7: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 9: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; case 11: etime-&gt;et_day = (etime-&gt;et_day) - 31; break; // Months with only 30 days case 3: etime-&gt;et_day = (etime-&gt;et_day) - 30; break; case 5: etime-&gt;et_day = (etime-&gt;et_day) - 30; break; case 8: etime-&gt;et_day = (etime-&gt;et_day) - 30; break; case 10: etime-&gt;et_day = (etime-&gt;et_day) - 30; break; // Leap year month a.k.a Febuary case 1: if (trackyear % leapy) { etime-&gt;et_day = (etime-&gt;et_day) - 28; } else { etime-&gt;et_day = (etime-&gt;et_day) - 29; } break; } trackmonth++; } while(etime-&gt;et_day &gt; 0); etime-&gt;et_mon = trackmonth - 1; // Reverts day offset from previous switch to // accurately represent the current day switch (etime-&gt;et_mon) { // Months with 31 days case 0: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 2: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 4: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 6: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 7: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 9: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; case 11: etime-&gt;et_day = (etime-&gt;et_day) + 31; break; // Months with only 30 days case 3: etime-&gt;et_day = (etime-&gt;et_day) + 30; break; case 5: etime-&gt;et_day = (etime-&gt;et_day) + 30; break; case 8: etime-&gt;et_day = (etime-&gt;et_day) + 30; break; case 10: etime-&gt;et_day = (etime-&gt;et_day) + 30; break; // Leap year month a.k.a Febuary case 1: if (trackyear % leapy) { etime-&gt;et_day = (etime-&gt;et_day) + 28; } else { etime-&gt;et_day = (etime-&gt;et_day) + 29; } break; } return etime; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload