// // 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(duration_since_epoch); //将时间戳转换为int TODO: 这在2038年之后可能会导致溢出 int timestamp = static_cast(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(mktime(timeinfo)); return targetTime; } int NetTime::getTimeInTheMonth(int curTime, int day, int hour){ // 将时间戳转换为tm结构 time_t timestamp = static_cast(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(mktime(timeInfo)); // 返回新的时间戳 return newTimestamp; } int NetTime::getTimeInCurDay(int curTime, int hour){ // 将时间戳转换为tm结构 time_t timestamp = static_cast(curTime); struct tm* timeInfo = localtime(×tamp); // 设置小时 timeInfo->tm_hour = hour; // 设置小时 timeInfo->tm_min = 0; // 设置分钟 timeInfo->tm_sec = 0; // 设置秒钟 // 转换为时间戳 int newTimestamp = static_cast(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(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