#include <iostream>
#include <ctime>
struct tm* fromOADate(struct tm* p_Tm, double p_OADate)
{
static const int64_t OA_UnixTimestamp = -2209161600; /* 30-Dec-1899 */
if (!( 25569 <= p_OADate /* 01-Jan-1970 00:00:00 */
&& p_OADate <= 2958465)) /* 31-Dec-9999 00:00:00 */
{
throw std::string("OADate must be between 25569 and 2958465!");
}
time_t OADatePassedDays = p_OADate;
double OADateDayTime = p_OADate - OADatePassedDays;
time_t OADateSeconds = OA_UnixTimestamp
+ OADatePassedDays * 24LL * 3600LL
+ OADateDayTime * 24.0 * 3600.0;
/* date was greater than 19-Jan-2038 and build is 32 bit */
if (0 > OADateSeconds)
{
throw std::string("OADate must be between 25569 and 50424.134803241!");
}
return gmtime_r(&OADateSeconds, p_Tm);
}
int main()
{
struct tm timeVal;
std::cout << asctime(fromOADate(&timeVal, 25569)); /* 01-Jan-1970 00:00:00 */
std::cout << asctime(fromOADate(&timeVal, 50424.134803241)); /* 19-Jan-2038 03:14:07 */
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CgpzdHJ1Y3QgdG0qIGZyb21PQURhdGUoc3RydWN0IHRtKiBwX1RtLCBkb3VibGUgcF9PQURhdGUpCnsKICAgc3RhdGljIGNvbnN0IGludDY0X3QgT0FfVW5peFRpbWVzdGFtcCA9IC0yMjA5MTYxNjAwOyAvKiAzMC1EZWMtMTg5OSAqLwoKICAgaWYgKCEoICAgMjU1NjkgPD0gcF9PQURhdGUgICAgICAgICAgICAgIC8qIDAxLUphbi0xOTcwIDAwOjAwOjAwICovCiAgICAgICAgICYmICAgICAgICAgIHBfT0FEYXRlIDw9IDI5NTg0NjUpKSAvKiAzMS1EZWMtOTk5OSAwMDowMDowMCAqLwogICB7CiAgICAgIHRocm93IHN0ZDo6c3RyaW5nKCJPQURhdGUgbXVzdCBiZSBiZXR3ZWVuIDI1NTY5IGFuZCAyOTU4NDY1ISIpOwogICB9CgogICB0aW1lX3QgT0FEYXRlUGFzc2VkRGF5cyA9IHBfT0FEYXRlOwogICBkb3VibGUgT0FEYXRlRGF5VGltZSAgICA9IHBfT0FEYXRlIC0gT0FEYXRlUGFzc2VkRGF5czsKICAgdGltZV90IE9BRGF0ZVNlY29uZHMgICAgPSBPQV9Vbml4VGltZXN0YW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT0FEYXRlUGFzc2VkRGF5cyAqIDI0TEwgKiAzNjAwTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPQURhdGVEYXlUaW1lICogMjQuMCAqIDM2MDAuMDsKCiAgIC8qIGRhdGUgd2FzIGdyZWF0ZXIgdGhhbiAxOS1KYW4tMjAzOCBhbmQgYnVpbGQgaXMgMzIgYml0ICovCiAgIGlmICgwID4gT0FEYXRlU2Vjb25kcykKICAgewogICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT0FEYXRlIG11c3QgYmUgYmV0d2VlbiAyNTU2OSBhbmQgNTA0MjQuMTM0ODAzMjQxISIpOwogICB9CgogICByZXR1cm4gZ210aW1lX3IoJk9BRGF0ZVNlY29uZHMsIHBfVG0pOwp9CgoKaW50IG1haW4oKQp7CiAgIHN0cnVjdCB0bSB0aW1lVmFsOwoKICAgc3RkOjpjb3V0IDw8IGFzY3RpbWUoZnJvbU9BRGF0ZSgmdGltZVZhbCwgMjU1NjkpKTsgICAgICAgICAgIC8qIDAxLUphbi0xOTcwIDAwOjAwOjAwICovCiAgIHN0ZDo6Y291dCA8PCBhc2N0aW1lKGZyb21PQURhdGUoJnRpbWVWYWwsIDUwNDI0LjEzNDgwMzI0MSkpOyAvKiAxOS1KYW4tMjAzOCAwMzoxNDowNyAqLwoKICAgcmV0dXJuIDA7Cn0=