问题
通过给定当前时间相对于1970/01/01 00:00:00 的纳秒数,求当前的时间。比如当前纳秒数为 1597792400289124531,对应的时间为2020-08-19 07:13:20.891
算法
利用C++11提供的纳秒获取函数求得当前纳秒数,然后除以1000000000求得秒,在计算时考虑闰年,然后计算求出相应的年月日时分秒。注意在计算的时候还要考虑时区,比如中国在东8区,还要加上8小时的秒数。
实现代码
#include <iostream>
#include <random>
#include <string>
#include <chrono>
using namespace std;
using namespace std::chrono;
void getDate(long long time) {
int seconds = time / 1000000000 + 8 * 3600;// time zone +8
int days = seconds / 86400;
int year = 1970 + (int) (days / 1461) * 4; // recycled in 4 years = 1461 days
int month = 0;
int day = days % 1461;
day = day > 730 ? day - 1 : day;
year += (int) (day / 365);
day = day % 365;
int monthday[]{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
for (int i = 0; i < 13; i++) {
if (day < monthday[i + 1]) {
month = i + 1;
day = day - monthday[i] + 1;
break;
}
}
int sec = seconds % 86400;
int hour = (int) (sec / 3600);
int minute = (int) (sec % 3600 / 60);
int second = sec % 60;
int nanoseconds = time % 1000000000;
int millisecond = nanoseconds / 1000;
cout << year << "/" << month << "/" << day << " " << hour << ":"
<< minute << ":" << second << "." << millisecond << endl;
}
int main() {
// 获取当前时间
system_clock::time_point now = system_clock::now();
// 距离1970-01-01 00:00:00的纳秒数
chrono::nanoseconds d = now.time_since_epoch();
cout << "current nanoseconds:" << d.count() << endl << "currnet date time: " ;
getDate(d.count()) ;
return 0;
}
输出
current nanoseconds:1597793495969797782
currnet date time: 2020/8/19 7:31:35.969797