RUNetTime.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //
  2. // RUNetTime.cpp
  3. // red_utils_mac
  4. //
  5. // Created by chunlin zhang on 2024/6/18.
  6. //
  7. #include "RUNetTime.h"
  8. #include "network/HttpRequest.h"
  9. #include "network/HttpResponse.h"
  10. #include "network/HttpClient.h"
  11. #include "RUPlatform.h"
  12. NS_RU_BEGIN
  13. static NetTime* s_netTime = nullptr;
  14. NetTime::NetTime(){
  15. }
  16. NetTime::~NetTime(){
  17. }
  18. NetTime* NetTime::getInstance(){
  19. if(!s_netTime){
  20. s_netTime = new(std::nothrow)NetTime;
  21. s_netTime->autorelease();
  22. s_netTime->retain();
  23. s_netTime->initNetTime();
  24. }
  25. return s_netTime;
  26. }
  27. void NetTime::initNetTime(){
  28. recordUserTimeZoneOffset();
  29. }
  30. void NetTime::enterForeground(){
  31. }
  32. int NetTime::getCurrentTime(){
  33. if(_netTimeAnchor <= 0){
  34. auto tServer = Platform::getInstance()->getServerTime();
  35. if (tServer > 0) {
  36. _netTimeAnchor = tServer;
  37. _systemUpTimeAnchor = Platform::getInstance()->getSystemUpTime();
  38. }
  39. }
  40. if (_netTimeAnchor > 0) {
  41. int systemUpTime = Platform::getInstance()->getSystemUpTime();
  42. int deltaSecond = systemUpTime - _systemUpTimeAnchor;//从锚定开始经过了多长时间
  43. return _netTimeAnchor + deltaSecond;//从锚点向后计算差值时间,便是精准的时间
  44. } else {
  45. return 0;
  46. }
  47. }
  48. int NetTime::getCurrentTimeWithTimeZone(){
  49. int timeZoneOffset = getUserTimeZoneOffset();
  50. //获取当前UTC时间
  51. int time = convertToUserTimezone(_netTimeAnchor, timeZoneOffset);
  52. return time;
  53. }
  54. int NetTime::getUserDeviceTime(){
  55. //获取当前时间点
  56. auto now = std::chrono::system_clock::now();
  57. //转换为自1970年1月1日以来的时间间隔
  58. auto duration_since_epoch = now.time_since_epoch();
  59. //将时间间隔转换为秒
  60. auto duration_in_seconds = std::chrono::duration_cast<std::chrono::seconds>(duration_since_epoch);
  61. //将时间戳转换为int TODO: 这在2038年之后可能会导致溢出
  62. int timestamp = static_cast<int>(duration_in_seconds.count());
  63. return timestamp;
  64. }
  65. int NetTime::getTimeInThisWeek(int curTime, int weekDay, int hour){
  66. time_t timestamp = curTime;
  67. struct tm* timeinfo = localtime(&timestamp);
  68. // 计算当前时间戳所在周的目标日期
  69. int daysUntilTargetDay = (weekDay - timeinfo->tm_wday + 7) % 7;
  70. time_t targetTimestamp = timestamp + daysUntilTargetDay * 24 * 3600;
  71. // 设置目标小时数
  72. timeinfo = localtime(&targetTimestamp);
  73. timeinfo->tm_hour = hour;
  74. timeinfo->tm_min = 0;
  75. timeinfo->tm_sec = 0;
  76. int targetTime = static_cast<int>(mktime(timeinfo));
  77. return targetTime;
  78. }
  79. int NetTime::getTimeInTheMonth(int curTime, int day, int hour){
  80. // 将时间戳转换为tm结构
  81. time_t timestamp = static_cast<time_t>(curTime);
  82. struct tm* timeInfo = localtime(&timestamp);
  83. // 设置日期和时间
  84. timeInfo->tm_mday = day; // 设置日期
  85. timeInfo->tm_hour = hour; // 设置小时
  86. timeInfo->tm_min = 0; // 设置分钟
  87. timeInfo->tm_sec = 0; // 设置秒钟
  88. // 转换为时间戳
  89. int newTimestamp = static_cast<int>(mktime(timeInfo));
  90. // 返回新的时间戳
  91. return newTimestamp;
  92. }
  93. int NetTime::getTimeInCurDay(int curTime, int hour){
  94. // 将时间戳转换为tm结构
  95. time_t timestamp = static_cast<time_t>(curTime);
  96. struct tm* timeInfo = localtime(&timestamp);
  97. // 设置小时
  98. timeInfo->tm_hour = hour; // 设置小时
  99. timeInfo->tm_min = 0; // 设置分钟
  100. timeInfo->tm_sec = 0; // 设置秒钟
  101. // 转换为时间戳
  102. int newTimestamp = static_cast<int>(mktime(timeInfo));
  103. // 返回新的时间戳
  104. return newTimestamp;
  105. }
  106. int NetTime::getTimeInNextDay(int curTime, int hour){
  107. int curDayTime = getTimeInCurDay(curTime, hour);
  108. int targetDayTime = curDayTime + 24 * 60 * 60;
  109. return targetDayTime;
  110. }
  111. int NetTime::getMonthlySecond(long curTime){
  112. // 将时间戳转换为tm结构
  113. time_t timestamp = static_cast<time_t>(curTime);
  114. struct tm* timeInfo = localtime(&timestamp);
  115. int curMonth = timeInfo->tm_mon;
  116. curMonth = curMonth % 12;
  117. // 设置小时
  118. timeInfo->tm_mon = curMonth + 1; // 设置为下个月
  119. // 转换为时间戳
  120. long newTimestamp = mktime(timeInfo);
  121. int deltaTime = (int)(newTimestamp - curTime);
  122. return deltaTime;
  123. }
  124. void NetTime::recordUserTimeZoneOffset(){
  125. //没有记录过时区,则记录时区
  126. if(!UserDefault::getInstance()->getBoolForKey(UserDefaultKey_RUNetTime_TimeZoneRecord, false)){
  127. // 获取当前时间点
  128. auto now = std::chrono::system_clock::now();
  129. // 转换为time_t以便获取tm结构体
  130. std::time_t now_time = std::chrono::system_clock::to_time_t(now);
  131. // 获取tm结构体
  132. std::tm* now_tm = std::localtime(&now_time);
  133. // 计算时区偏移量(单位:秒),如果需要保存按小时的时区还需除以3600
  134. int timezone_offset = (int)now_tm->tm_gmtoff;
  135. UserDefault::getInstance()->setIntegerForKey(UserDefaultKey_RUNetTime_TimeZoneOffset, timezone_offset);
  136. UserDefault::getInstance()->setBoolForKey(UserDefaultKey_RUNetTime_TimeZoneRecord, true);
  137. }
  138. }
  139. int NetTime::getUserTimeZoneOffset(){
  140. int timezone_offset = UserDefault::getInstance()->getIntegerForKey(UserDefaultKey_RUNetTime_TimeZoneOffset, 0);
  141. return timezone_offset;
  142. }
  143. int NetTime::convertToUserTimezone(int utcTime, int timeZoneOffset) {
  144. int offsetTime = utcTime + timeZoneOffset;
  145. return offsetTime;
  146. }
  147. NS_RU_END