fork(3) download
  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. struct tm* fromOADate(struct tm* p_Tm, double p_OADate)
  5. {
  6. static const int64_t OA_UnixTimestamp = -2209161600; /* 30-Dec-1899 */
  7.  
  8. if (!( 25569 <= p_OADate /* 01-Jan-1970 00:00:00 */
  9. && p_OADate <= 2958465)) /* 31-Dec-9999 00:00:00 */
  10. {
  11. throw std::string("OADate must be between 25569 and 2958465!");
  12. }
  13.  
  14. time_t OADatePassedDays = p_OADate;
  15. double OADateDayTime = p_OADate - OADatePassedDays;
  16. time_t OADateSeconds = OA_UnixTimestamp
  17. + OADatePassedDays * 24LL * 3600LL
  18. + OADateDayTime * 24.0 * 3600.0;
  19.  
  20. /* date was greater than 19-Jan-2038 and build is 32 bit */
  21. if (0 > OADateSeconds)
  22. {
  23. throw std::string("OADate must be between 25569 and 50424.134803241!");
  24. }
  25.  
  26. return gmtime_r(&OADateSeconds, p_Tm);
  27. }
  28.  
  29.  
  30. int main()
  31. {
  32. struct tm timeVal;
  33.  
  34. std::cout << asctime(fromOADate(&timeVal, 25569)); /* 01-Jan-1970 00:00:00 */
  35. std::cout << asctime(fromOADate(&timeVal, 50424.134803241)); /* 19-Jan-2038 03:14:07 */
  36.  
  37. return 0;
  38. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Thu Jan  1 00:00:00 1970
Tue Jan 19 03:14:07 2038