123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //
- // RUNetTime.cpp
- // red_utils_mac
- //
- // Created by chunlin zhang on 2024/6/18.
- //
- #include "RUNetTime.h"
- #include "network/HttpRequest.h"
- #include "network/HttpResponse.h"
- #include "network/HttpClient.h"
- #include "RUPlatform.h"
- NS_RU_BEGIN
- static NetTime* s_netTime = nullptr;
- NetTime::NetTime(){
-
- }
- NetTime::~NetTime(){
- }
- NetTime* NetTime::getInstance(){
- if(!s_netTime){
- s_netTime = new(std::nothrow)NetTime;
- s_netTime->autorelease();
- s_netTime->retain();
- s_netTime->initNetTime();
- }
- return s_netTime;
- }
- void NetTime::initNetTime(){
- recordUserTimeZoneOffset();
- }
- void NetTime::enterForeground(){
- }
- int NetTime::getCurrentTime(){
- if(_netTimeAnchor <= 0){
- auto tServer = Platform::getInstance()->getServerTime();
- if (tServer > 0) {
- _netTimeAnchor = tServer;
- _systemUpTimeAnchor = Platform::getInstance()->getSystemUpTime();
- }
- }
- if (_netTimeAnchor > 0) {
- int systemUpTime = Platform::getInstance()->getSystemUpTime();
- int deltaSecond = systemUpTime - _systemUpTimeAnchor;//从锚定开始经过了多长时间
- return _netTimeAnchor + deltaSecond;//从锚点向后计算差值时间,便是精准的时间
- } else {
- return 0;
- }
- }
- int NetTime::getCurrentTimeWithTimeZone(){
- int timeZoneOffset = getUserTimeZoneOffset();
- //获取当前UTC时间
- int time = convertToUserTimezone(_netTimeAnchor, timeZoneOffset);
- return time;
- }
- int NetTime::getUserDeviceTime(){
- //获取当前时间点
- auto now = std::chrono::system_clock::now();
- //转换为自1970年1月1日以来的时间间隔
- auto duration_since_epoch = now.time_since_epoch();
- //将时间间隔转换为秒
- auto duration_in_seconds = std::chrono::duration_cast<std::chrono::seconds>(duration_since_epoch);
- //将时间戳转换为int TODO: 这在2038年之后可能会导致溢出
- int timestamp = static_cast<int>(duration_in_seconds.count());
- return timestamp;
- }
- int NetTime::getTimeInThisWeek(int curTime, int weekDay, int hour){
- time_t timestamp = curTime;
- struct tm* timeinfo = localtime(×tamp);
- // 计算当前时间戳所在周的目标日期
- int daysUntilTargetDay = (weekDay - timeinfo->tm_wday + 7) % 7;
- time_t targetTimestamp = timestamp + daysUntilTargetDay * 24 * 3600;
- // 设置目标小时数
- timeinfo = localtime(&targetTimestamp);
- timeinfo->tm_hour = hour;
- timeinfo->tm_min = 0;
- timeinfo->tm_sec = 0;
- int targetTime = static_cast<int>(mktime(timeinfo));
- return targetTime;
- }
- int NetTime::getTimeInTheMonth(int curTime, int day, int hour){
- // 将时间戳转换为tm结构
- time_t timestamp = static_cast<time_t>(curTime);
- struct tm* timeInfo = localtime(×tamp);
- // 设置日期和时间
- timeInfo->tm_mday = day; // 设置日期
- timeInfo->tm_hour = hour; // 设置小时
- timeInfo->tm_min = 0; // 设置分钟
- timeInfo->tm_sec = 0; // 设置秒钟
- // 转换为时间戳
- int newTimestamp = static_cast<int>(mktime(timeInfo));
- // 返回新的时间戳
- return newTimestamp;
- }
- int NetTime::getTimeInCurDay(int curTime, int hour){
- // 将时间戳转换为tm结构
- time_t timestamp = static_cast<time_t>(curTime);
- struct tm* timeInfo = localtime(×tamp);
- // 设置小时
- timeInfo->tm_hour = hour; // 设置小时
- timeInfo->tm_min = 0; // 设置分钟
- timeInfo->tm_sec = 0; // 设置秒钟
- // 转换为时间戳
- int newTimestamp = static_cast<int>(mktime(timeInfo));
- // 返回新的时间戳
- return newTimestamp;
- }
- int NetTime::getTimeInNextDay(int curTime, int hour){
- int curDayTime = getTimeInCurDay(curTime, hour);
- int targetDayTime = curDayTime + 24 * 60 * 60;
- return targetDayTime;
- }
- int NetTime::getMonthlySecond(long curTime){
- // 将时间戳转换为tm结构
- time_t timestamp = static_cast<time_t>(curTime);
- struct tm* timeInfo = localtime(×tamp);
-
- int curMonth = timeInfo->tm_mon;
- curMonth = curMonth % 12;
- // 设置小时
- timeInfo->tm_mon = curMonth + 1; // 设置为下个月
-
- // 转换为时间戳
- long newTimestamp = mktime(timeInfo);
-
- int deltaTime = (int)(newTimestamp - curTime);
- return deltaTime;
- }
- void NetTime::recordUserTimeZoneOffset(){
- //没有记录过时区,则记录时区
- if(!UserDefault::getInstance()->getBoolForKey(UserDefaultKey_RUNetTime_TimeZoneRecord, false)){
- // 获取当前时间点
- auto now = std::chrono::system_clock::now();
- // 转换为time_t以便获取tm结构体
- std::time_t now_time = std::chrono::system_clock::to_time_t(now);
- // 获取tm结构体
- std::tm* now_tm = std::localtime(&now_time);
- // 计算时区偏移量(单位:秒),如果需要保存按小时的时区还需除以3600
- int timezone_offset = (int)now_tm->tm_gmtoff;
- UserDefault::getInstance()->setIntegerForKey(UserDefaultKey_RUNetTime_TimeZoneOffset, timezone_offset);
- UserDefault::getInstance()->setBoolForKey(UserDefaultKey_RUNetTime_TimeZoneRecord, true);
- }
- }
- int NetTime::getUserTimeZoneOffset(){
- int timezone_offset = UserDefault::getInstance()->getIntegerForKey(UserDefaultKey_RUNetTime_TimeZoneOffset, 0);
- return timezone_offset;
- }
- int NetTime::convertToUserTimezone(int utcTime, int timeZoneOffset) {
- int offsetTime = utcTime + timeZoneOffset;
- return offsetTime;
- }
- NS_RU_END
|