Lau*_*hel 3 c++ datetime c++20
我正在测试如下的库:
std::chrono::system_clock::time_point FromDateTime(const DateTime& dateTime)
{
std::tm tm{};
tm.tm_year = dateTime.Year - 1900;
tm.tm_mon = dateTime.Month - 1;
tm.tm_mday = dateTime.Day;
tm.tm_hour = dateTime.Hour;
tm.tm_min = dateTime.Minute;
tm.tm_sec = dateTime.Second;
const auto& time = std::mktime(&tm);
const auto& timePoint = std::chrono::system_clock::from_time_t(time);
return timePoint;
}
TEST_F(MyLibraryFixture, GetDateTime)
{
// Arrange
const auto& now = std::chrono::system_clock::now();
// Act
const auto& actual = _testee->GetDateTime();
// Assert
const auto& timeDiscrepanceInSec = std::chrono::duration_cast<std::chrono::seconds>(FromDateTime(actual) - now);
ASSERT_TRUE(timeDiscrepanceInSec.count() < 10);
}
Run Code Online (Sandbox Code Playgroud)
该DateTime类型只是带有上述使用字段的原始结构。电话
_testee->GetDateTime();
Run Code Online (Sandbox Code Playgroud)
返回一个DateTime结构体,日期时间实际上是本地时间。由于我正在测试的库固有的某种原因,我需要将当地时间与现在的时间进行比较。我上面的代码似乎工作正常,我“希望”当我们回到夏季时它仍然可以工作。
现在,c++20 公开了许多日期时间实用程序。我浏览了文档,尝试了一些东西,但我无法找到与上述代码片段相对应的可靠内容。有可能吗(我的意思是,不使用std::mktime和奇怪的std::tm)?
我能得到的最接近的是这个,但它仍然是错误的(我得到一小时的差异):
std::chrono::time_point<std::chrono::local_t, std::chrono::seconds> FromDateTime(const DateTime& dateTime)
{
const auto& d = std::chrono::year_month_day(std::chrono::year(dateTime.Year), std::chrono::month(dateTime.Month), std::chrono::day(dateTime.Day));
const auto& t = std::chrono::hours(dateTime.Hour) + std::chrono::minutes(dateTime.Minute) + std::chrono::seconds(dateTime.Second);
const auto& dt = std::chrono::local_days(d) + t;
return dt;
}
TEST_F(MyLibraryFixture, GetDateTime)
{
// Arrange
const auto& now = std::chrono::utc_clock::now();
// Act
const auto& actual = _testee->GetDateTime();
// Assert
const auto& timeDiscrepanceInSec = std::chrono::duration_cast<std::chrono::seconds>(FromDateTime(actual).time_since_epoch() - now.time_since_epoch());
ASSERT_TRUE(timeDiscrepanceInSec.count() < 10);
}
Run Code Online (Sandbox Code Playgroud)
以下是与您的第一个版本等效的 C++20 代码FromDateTime:
std::chrono::system_clock::time_point
FromDateTime(const DateTime& dateTime)
{
using namespace std::chrono;
auto local_tp = local_days{year{dateTime.Year}/dateTime.Month/dateTime.Day} +
hours{dateTime.Hour} + minutes{dateTime.Minute} + seconds{dateTime.Second};
zoned_time zt{current_zone(), local_tp};
return zt.get_sys_time();
}
Run Code Online (Sandbox Code Playgroud)
local_time您创建了一个using ,走在正确的轨道上local_days。
无需显式命名year_month_day类型。这是使用符号为您生成的/。
获得本地时间后,您可以通过构建zoned_timewithcurrent_zone()和 来将其与计算机的本地时区关联起来local_time。
然后你就可以sys_time从其中提取出来了zoned_time。是sys_timea time_point<system_clock, seconds>(秒精度system_clock::time_point),即 UTC(不包括闰秒)。这隐式转换为返回类型:system_clock::time_point。
local_time如果需要,您可以根据其他时区而不是计算机的本地时区来解释。例如:
zoned_time zt{"America/New_York", local_tp};
Run Code Online (Sandbox Code Playgroud)
一般来说,是一种用于在和 之间zoned_time进行转换的便捷类型。local_timesys_time
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |