【问题标题】:How to Convert String date to double in C++,如何在 C++ 中将字符串日期转换为双精度,
【发布时间】:2020-11-07 06:07:35
【问题描述】:

我从服务器 11/07/2020 10:57:13 获取字符串,我将其转换为双精度值 1604723233,但是转换后的双精度值比实际值小 1 小时。

以下是我尝试转换的方式...

double StringDateToDouble(string &strDate, string format)
{
    tm currentTime = CurrentTimeToTM();
    tm timeinfo;

    string strTimeZone = currentTime.tm_zone;

    strDate.append("");
    strDate.append(strTimeZone);
    strptime(strDate.c_str(), format.c_str(), &timeinfo);

    time_t timeInSec = mktime(&timeinfo);
    return static_cast<double>(timeInSec);
 }

tm CurrentTimeToTM()
{
 struct tm timeinfo = {0};
 time_t rawtime;
 rawtime = time(&rawtime);

 localtime_r(&rawtime, &timeinfo);
 return timeinfo;
}

正确的方法是什么?这里有什么遗漏吗?任何建议表示赞赏。

【问题讨论】:

  • 代码的用途是什么?为什么你需要一个日期的double?如何使用double 表示日期?
  • C++ 标准不保证time_t(0)1970-01-01T00:00Z。 C++20 引入了time_since_epoch 将与 UNIX 纪元相关的保证。
  • 顺便说一句,不能保证std::time_t 是整数类型,或者它的值是自某个纪元以来的秒数。
  • 哦,正好休息一小时听起来像是夏令时问题。
  • @Vijay 这是因为时区不同。您从服务器获得的响应是​​在哪个时区?

标签: android c++ c++11


【解决方案1】:

这是我建议的代码:

#include <ctime>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>

const int IST = (5 * 60 + 30) * 60; // GMT+05:30 (in s)

double StringDateToDouble(std::string &&strDate,
                          std::string &&format = "%D %T") {
  std::tm tm;
  std::istringstream ss(strDate);
  ss >> std::get_time(&tm, format.c_str());
  return (std::mktime(&tm) - timezone) - IST;
}

int main() { std::cout << (long)StringDateToDouble("11/07/2020 12:59:22"); }

参考资料:

  1. How to convert a string variable containing time to time_t type in c++?

  2. std::mktime and timezone info

  3. Get Unix timestamp with C++


如第二个参考文献中所述,std::mktime(&amp;tm) - timezone 将给出 GMT 时间。现在,由于您的服务器在 IST 中发送响应,您需要手动从中减去它以获得自 Epoch 以来的时间。


请注意,C++ 标准不保证1970-01-01T00:00Zstd::time_t(0)

引用std::time:

未指定 std::time_t 中日历时间的编码,但大多数系统符合 POSIX 规范并返回一个整数类型的值,该值保存自纪元以来的秒数。 std::time_t 是 32 位有符号整数的实现(许多历史实现)在 2038 年失败。

有关此问题的更多讨论,请参阅参考 3 中提到的线程。

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 2015-04-10
    • 1970-01-01
    • 2012-07-09
    • 2022-01-20
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多