【问题标题】:C++ - How to get date in specific time zone [duplicate]C ++ - 如何获取特定时区的日期[重复]
【发布时间】:2015-11-09 00:57:17
【问题描述】:

在 C++ 中获取当前日期/时间已经是known and answered

目标

获取特定时区的日期/时间。 这意味着,不同时区的不同用户同时运行我的应用程序,将得到相同的结果。

注意

  1. 为简单起见,假设特定时区为Eastern Time Zone
  2. 应用只能在 windows 环境下运行。
  3. 首选原生解决方案(非增强等)

我读过Getting current time of a different timezone using C++。没有答案似乎解决了我的问题。也许我不完全理解SystemTimeToTzSpecificLocalTime 的用法。 如果我用一些参数调用GetTimeZoneInformation 来指定所需的时区,那会让我更进一步。

【问题讨论】:

    标签: c++ date c++11 time timezone


    【解决方案1】:

    如果你使用的是windows环境,你可以使用SystemTimeToTzSpecificLocalTime函数。它将UTC时间转换为指定时区的本地时间。

    【讨论】:

      【解决方案2】:

      这是一个有趣的练习。我不知道的唯一部分是如何在std::tm* 上设置时区。它是某种全局变量吗?

      #include <ctime>
      #include <iomanip>
      #include <iostream>
      
      inline const int EST_diff(const bool is_DST)
      {
          if (is_DST < 0)
              std::cout << "Erorr! No DST Information available!" << std::endl;    
      
          if (is_DST)
              return 4;
          else
              return 5;
      }
      
      inline const bool try_rollback(int& time)
      {
          if (time > 1)
          {
              time -= 1;
              return true;
          }
          else
              return false;
      }
      
      inline int leapyear(const std::tm *const time)
      {
          return time->tm_year % 4 == 0 ? 1 : 0;
      }
      
      inline int back_one(int& time, const int increment)
      {
          return time = time > 1 ? time - 1 : time + increment - 1;
      }
      
      inline int advance_hours(int& time, const int difference)
      {
          return time += 24 - difference;
      }
      
      inline int days_in_month(const int month, const bool leapyear)
      {
          switch(month)
          {
          case 0: //january
              return 31;
          case 1: //february
              return leapyear ? 29 : 28;
          case 2: //march
              return 31;
          case 3: //april
              return 30;
          case 4: //may
              return 31;
          case 5: //june
              return 30;
          case 6: //july
              return 31;
          case 7: //august
              return 31;
          case 8: //september
              return 30;
          case 9: //october
              return 31;
          case 10:    //november
              return 30;
          case 11:    //december
              return 31;
          default:
              std::cout << "Input error in days_in_month!" << std::endl;
              break;
          }
      
          return -1;
      }
      
      inline std::tm* rollback_week(std::tm *const time)
      {
          back_one(time->tm_wday, 7);
          advance_hours(time->tm_hour, EST_diff(time->tm_isdst));
          return time;
      }
      
      inline std::tm* rollback_month(std::tm *const time)
      {
          back_one(time->tm_mon, 12);
          back_one(time->tm_mday, days_in_month(time->tm_mon, leapyear(time)));
          return rollback_week(time);
      }
      
      inline std::tm* rollback_year(std::tm *const time)
      {
          time->tm_year -= 1;
          time->tm_yday += 364 + leapyear(time);
          return rollback_month(time);
      }
      
      inline std::tm* UTC_to_EST(std::tm *const time)
      {
          if (time->tm_hour > EST_diff(time->tm_isdst))
              time->tm_hour -= EST_diff(time->tm_isdst);
          else
          {
              if (!try_rollback(time->tm_yday))
                  rollback_year(time);
              else if(!try_rollback(time->tm_mday))
                  rollback_month(time);
              else if(!try_rollback(time->tm_wday))
                  rollback_week(time);
          }
          return time;
      }
      
      int main()
      {
          std::time_t t = std::time(NULL);
          std::tm* time(std::gmtime(&t));
          std::cout << "UTC: " << std::put_time(time, "%c %Z") << '\n';
          std::cout << "EST: " << std::put_time(UTC_to_EST(time), "%c %Z") << '\n';
          std::cout << "Daylight Savings Time is " << (std::gmtime(&t)->tm_isdst < 0 ? "invalid" : (std::gmtime(&t)->tm_isdst > 0 ? "active" : "inactive")) << std::endl;
      }
      

      Live On Coliru

      【讨论】:

        【解决方案3】:

        假设您只谈论 Windows,并且您只希望不同时区的用户在同时请求时间时获得相同的结果,但不关心特定时区,答案很简单:GetSystemTime() .

        无论时区如何,它都会为您提供 UTC 时间。

        【讨论】:

          猜你喜欢
          • 2013-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-01
          • 1970-01-01
          • 2018-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多