NTP rollover-safe design with ESP8266 (Curiosity)

Explain Ant-Man's "not it" scene from Avengers: Endgame

Did thousands of women die every year due to illegal abortions before Roe v. Wade?

Concise way to draw this pyramid

When leasing/renting out an owned property, is there a standard ratio between monthly rent and the mortgage?

Anyone teach web development? How do you assess it?

Strange math syntax in old basic listing

What is the Process for Re-certifying Flight Hardware?

Is it OK to bring delicacies from hometown as tokens of gratitude for an out-of-town interview?

How should I push back against my job assigning "homework"?

California: "For quality assurance, this phone call is being recorded"

Is it a problem that pull requests are approved without any comments

Initialize an array of doubles at compile time

Comma Code - Ch. 4 Automate the Boring Stuff

Why was it possible to cause an Apple //e to shut down with SHIFT and paddle button 2?

Does Peach's float negate shorthop knockback multipliers?

What if you don't bring your credit card or debit for incidentals?

Will TSA allow me to carry a Continuous Positive Airway Pressure (CPAP) device?

Does any lore text explain why the planes of Acheron, Gehenna, and Carceri are the alignment they are?

Computing the differentials in the Adams spectral sequence

Short story written from alien perspective with this line: "It's too bright to look at, so they don't"

Show sparse matrices like chessboards

Responsibility for visa checking

How to detach yourself from a character you're going to kill?

NTP rollover-safe design with ESP8266 (Curiosity)



NTP rollover-safe design with ESP8266 (Curiosity)














1















The Arduino NTP implementation is rather naive in some respects. It basically just grabs the time in seconds from the raw packet, and then converts it to Unix time via subtraction. How would it be possible to create an implementation that is safe from at least this next NTP rollover (due in 2036)? I'd rather not design something that might suddenly fail in strange ways in a decade or two when I have forgotten why it might do so (but it's not horribly important if it's not easily fixed).



If it can make it to 2100, I'd have larger problems (the RTC would crap itself), so just this rollover is fine.



The existing implementation (https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.cpp):



unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;

this->_currentEpoc = secsSince1900 - SEVENZYYEARS;









share|improve this question





























    1















    The Arduino NTP implementation is rather naive in some respects. It basically just grabs the time in seconds from the raw packet, and then converts it to Unix time via subtraction. How would it be possible to create an implementation that is safe from at least this next NTP rollover (due in 2036)? I'd rather not design something that might suddenly fail in strange ways in a decade or two when I have forgotten why it might do so (but it's not horribly important if it's not easily fixed).



    If it can make it to 2100, I'd have larger problems (the RTC would crap itself), so just this rollover is fine.



    The existing implementation (https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.cpp):



    unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
    unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;

    this->_currentEpoc = secsSince1900 - SEVENZYYEARS;









    share|improve this question



























      1












      1








      1








      The Arduino NTP implementation is rather naive in some respects. It basically just grabs the time in seconds from the raw packet, and then converts it to Unix time via subtraction. How would it be possible to create an implementation that is safe from at least this next NTP rollover (due in 2036)? I'd rather not design something that might suddenly fail in strange ways in a decade or two when I have forgotten why it might do so (but it's not horribly important if it's not easily fixed).



      If it can make it to 2100, I'd have larger problems (the RTC would crap itself), so just this rollover is fine.



      The existing implementation (https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.cpp):



      unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
      unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
      // combine the four bytes (two words) into a long integer
      // this is NTP time (seconds since Jan 1 1900):
      unsigned long secsSince1900 = highWord << 16 | lowWord;

      this->_currentEpoc = secsSince1900 - SEVENZYYEARS;









      share|improve this question
















      The Arduino NTP implementation is rather naive in some respects. It basically just grabs the time in seconds from the raw packet, and then converts it to Unix time via subtraction. How would it be possible to create an implementation that is safe from at least this next NTP rollover (due in 2036)? I'd rather not design something that might suddenly fail in strange ways in a decade or two when I have forgotten why it might do so (but it's not horribly important if it's not easily fixed).



      If it can make it to 2100, I'd have larger problems (the RTC would crap itself), so just this rollover is fine.



      The existing implementation (https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.cpp):



      unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]);
      unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]);
      // combine the four bytes (two words) into a long integer
      // this is NTP time (seconds since Jan 1 1900):
      unsigned long secsSince1900 = highWord << 16 | lowWord;

      this->_currentEpoc = secsSince1900 - SEVENZYYEARS;






      esp8266 time






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 6 hours ago









      VE7JRO

      1,80251324




      1,80251324










      asked 9 hours ago









      RDragonrydrRDragonrydr

      379




      379






















          1 Answer
          1






          active

          oldest

          votes


















          4














          This implementation is perfectly fine. The calculations are done with
          unsigned numbers, so they are naturally rollover safe. The day NTP time
          rolls over, secsSince1900 will become a very small number, and
          subtracting SEVENZYYEARS from it will cause an extra roll over. Owing
          to the rules of modular arithmetics, these two rollovers compensate and
          you are guaranteed to get the correct result modulo
          232 s.



          In the end, you get a Unix time as an unsigned 32-bit integer. Unix time
          is traditionally signed, which makes the 32-bit representation roll over
          in January 2038. The authors of this library have instead chosen to
          represent it as an unsigned number, which means it will roll over in
          February 2106.






          share|improve this answer
























          • Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

            – RDragonrydr
            6 hours ago












          Your Answer






          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("schematics", function () {
          StackExchange.schematics.init();
          });
          }, "cicuitlab");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "540"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2farduino.stackexchange.com%2fquestions%2f65883%2fntp-rollover-safe-design-with-esp8266-curiosity%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          4














          This implementation is perfectly fine. The calculations are done with
          unsigned numbers, so they are naturally rollover safe. The day NTP time
          rolls over, secsSince1900 will become a very small number, and
          subtracting SEVENZYYEARS from it will cause an extra roll over. Owing
          to the rules of modular arithmetics, these two rollovers compensate and
          you are guaranteed to get the correct result modulo
          232 s.



          In the end, you get a Unix time as an unsigned 32-bit integer. Unix time
          is traditionally signed, which makes the 32-bit representation roll over
          in January 2038. The authors of this library have instead chosen to
          represent it as an unsigned number, which means it will roll over in
          February 2106.






          share|improve this answer
























          • Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

            – RDragonrydr
            6 hours ago
















          4














          This implementation is perfectly fine. The calculations are done with
          unsigned numbers, so they are naturally rollover safe. The day NTP time
          rolls over, secsSince1900 will become a very small number, and
          subtracting SEVENZYYEARS from it will cause an extra roll over. Owing
          to the rules of modular arithmetics, these two rollovers compensate and
          you are guaranteed to get the correct result modulo
          232 s.



          In the end, you get a Unix time as an unsigned 32-bit integer. Unix time
          is traditionally signed, which makes the 32-bit representation roll over
          in January 2038. The authors of this library have instead chosen to
          represent it as an unsigned number, which means it will roll over in
          February 2106.






          share|improve this answer
























          • Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

            – RDragonrydr
            6 hours ago














          4












          4








          4







          This implementation is perfectly fine. The calculations are done with
          unsigned numbers, so they are naturally rollover safe. The day NTP time
          rolls over, secsSince1900 will become a very small number, and
          subtracting SEVENZYYEARS from it will cause an extra roll over. Owing
          to the rules of modular arithmetics, these two rollovers compensate and
          you are guaranteed to get the correct result modulo
          232 s.



          In the end, you get a Unix time as an unsigned 32-bit integer. Unix time
          is traditionally signed, which makes the 32-bit representation roll over
          in January 2038. The authors of this library have instead chosen to
          represent it as an unsigned number, which means it will roll over in
          February 2106.






          share|improve this answer













          This implementation is perfectly fine. The calculations are done with
          unsigned numbers, so they are naturally rollover safe. The day NTP time
          rolls over, secsSince1900 will become a very small number, and
          subtracting SEVENZYYEARS from it will cause an extra roll over. Owing
          to the rules of modular arithmetics, these two rollovers compensate and
          you are guaranteed to get the correct result modulo
          232 s.



          In the end, you get a Unix time as an unsigned 32-bit integer. Unix time
          is traditionally signed, which makes the 32-bit representation roll over
          in January 2038. The authors of this library have instead chosen to
          represent it as an unsigned number, which means it will roll over in
          February 2106.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 7 hours ago









          Edgar BonetEdgar Bonet

          25.5k22546




          25.5k22546













          • Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

            – RDragonrydr
            6 hours ago



















          • Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

            – RDragonrydr
            6 hours ago

















          Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

          – RDragonrydr
          6 hours ago





          Huh. That's actually rather cool. I knew of a similar method for millis(), but didn't know this worked for NTP as well. Thanks!

          – RDragonrydr
          6 hours ago


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Arduino Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2farduino.stackexchange.com%2fquestions%2f65883%2fntp-rollover-safe-design-with-esp8266-curiosity%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Taj Mahal Inhaltsverzeichnis Aufbau | Geschichte | 350-Jahr-Feier | Heutige Bedeutung | Siehe auch |...

          Baia Sprie Cuprins Etimologie | Istorie | Demografie | Politică și administrație | Arii naturale...

          Nicolae Petrescu-Găină Cuprins Biografie | Opera | In memoriam | Varia | Controverse, incertitudini...