- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR: 如何使用 std::chrono::system_clock::time_point
仅基于某些参数进行比较(例如,我只想要小时、分钟和秒,而不是天、月等)。
另外:在转换 std::chrono::system_clock::time_point
之后到 std::tm
, std::tm.tm_hours
包含比 std::chrono::system_clock::time_point
的原始输入高 1 的值。 .
我获得 std::chrono::system_clock::time_point
的理论方法去工作:
typedef std::chrono::system_clock::time_point TimePoint;
TimePoint MainWindow::createTimePoint(int h, int m)
{
TimePoint createdTime = std::chrono::system_clock::time_point{std::chrono::hours(h) + std::chrono::minutes(m)};
time_t tt = std::chrono::system_clock::to_time_t(createdTime);
tm timeExtracted = *localtime(&tt);
std::cout << "input:\t\t" << "H = " << h << ", M = " << m << std::endl;
std::cout << "timeExtracted:\t" << "H = " << timeExtracted.tm_hour << ", M = " << timeExtracted.tm_min << std::endl;
return createdTime;
}
timeExtracted
的小时数总是 +1 从输入
h
.
TimePoint
、日、月等也设置为随机值或初始化为某个值。关键是:我希望它们始终是相同的值,这样我的
TimePoint
(转换后)基本上显示了这一点:
timeExtracted.tm_sec = 0
timeExtracted.tm_min = m
timeExtracted.tm_hour = h
timeExtracted.tm_mon = 0
timeExtracted.tm_wday = 0
timeExtracted.tm_mday = 0
timeExtracted.tm_yday = 0
timeExtracted.tm_year = 0
timeExtracted.tm_isdst = 0
TimePoint
利用对它们使用 std::chrono 的比较操作,但只比较小时和分钟。
最佳答案
我将开始一个答案,但这不会是一个完整的答案,因为我还不确定完整的问题。不过,我可以帮忙。
TimePoint createdTime = system_clock::time_point{hours(h) + minutes(m)};
std::chrono::
限定词,以便更容易阅读和讨论)
system_clock::time_point
正在测量自 1970 年新年(UTC)以来的持续时间(以微秒或纳秒等某些单位为单位)。从技术上讲,以上是一个近似值,
system_clock
不计算闰秒,但我们现在可以(并且应该)忽略这个细节。
tm timeExtracted = *localtime(&tt);
system_clock::time_point
的技术和库并将其分解为
{year, month, day, hours, minutes, seconds, microseconds}
等字段.但这种转换还取决于您是否希望这些字段采用 UTC、本地时间或其他任意时区。
{h, m}
输入需要在将它们放入
system_clock::time_point
之前进行 UTC 偏移调整如果意图是
{h, m}
代表本地时间而不是 UTC。
system_clock::time_point
作为输入并将其与一周中每一天的打开/关闭时间列表进行比较,并确定输入时间是否在与输入时间相关的工作日的那些时间范围之内或之外
t
.假定商店营业时间是相对于商店的本地时区来说明的,这也是为运行此代码的计算机设置的当前时区。
#include "date/tz.h"
#include <algorithm>
#include <cassert>
#include <chrono>
bool
is_store_open_at(std::chrono::system_clock::time_point tp)
{
using namespace date;
using namespace std::chrono;
struct day_schedule
{
weekday wd;
minutes open;
minutes close;
};
// hours are expressed in terms of local time
static constexpr day_schedule store_hours[]
{
// week day open-time close-time
{Monday, 0h, 0h}, // closed all day
{Tuesday, 8h, 18h},
{Wednesday, 8h, 18h},
{Thursday, 8h, 18h},
{Friday, 8h, 18h},
{Saturday, 8h, 15h+30min},
{Sunday, 9h+30min, 15h}
};
auto local_tp = current_zone()->to_local(tp);
auto local_day = floor<days>(local_tp);
auto local_time_of_day = local_tp - local_day;
weekday local_weekday{local_day};
auto ds = std::find_if(std::begin(store_hours), std::end(store_hours),
[local_weekday](day_schedule const& x)
{
return x.wd == local_weekday;
});
assert(ds != std::end(store_hours));
return ds->open <= local_time_of_day && local_time_of_day < ds->close;
}
#include <iostream>
int
main()
{
std::cout << is_store_open_at(std::chrono::system_clock::now()) << '\n';
}
open
和
close
day_schedule
的成员以本地时间测量“自午夜以来的分钟数”。
tp
以 UTC 表示,因为它的类型是
system_clock::time_point
. C++ 标准目前没有规定这一点,但明年的 C++20 会规定这一点。
zoned_seconds
用于转换UTC时间
t
根据调用
current_zone()
获取的计算机时区设置转换为本地时间.我已截断
t
到秒来简化一些语法。这不是绝对必要的。我已经编辑使用稍微简单的语法来消除
zoned_seconds
.
zoned_seconds
在其他示例中可能非常有用,但在这个示例中,麻烦多于其值(value)。
auto local_tp = current_zone()->to_local(tp)
是将 UTC 转换为本地时间点的更简单方法。
local_tp
是
chrono::time_point
被认为是“本地时间”,与
chrono::time_point
的系列不同。 s 与
system_clock
相关联.这样做的好处是,如果本地时间和 UTC 时间意外混合,这是一个编译时错误。
local_days
简直是
local_tp
截断为
days
精确。它仍然是
chrono::time_point
,只是一个粗略的,它指向本地时区描述的一天的开始。
local_tp - local_day
.
local_day
获得输入
weekday
.这是与
tp
相关的本地星期几.
store_hours
是一件简单的事情对于匹配
local_weekday
的条目.
local_time_of_day
则商店营业等于或超过
open
时间还没到
close
时间。
关于C++ std::tm 从 std::chrono::time_point 转换后返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57718779/
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
如何将计时持续时间转换为时间点,该时间点晚于具有给定持续时间的时钟纪元?我试图在计时时钟中找到纪元时间,但没有成功。 最佳答案 来自 20.12.6 [time.point] 的概要: templat
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
我有一个用户提供的持续时间 const int period_seconds = cfg.period_seconds; 我想floor一个time_point到那个duration的粒度。 我看到
给定两个分割值,自纪元以来的秒数和 µs,以下哪个更可取? auto timestamp = system_clock::time_point(seconds(time_seconds) + micr
我将 time_point 设置为下一个完整的五分钟,这很容易: template using minutes = std::chrono::duration, std::chrono::m
简单的问题,如何使用尽可能少的代码将 std::chrono::time_point 正确转换为 std::string? 注意:我不想将 cout 与 put_time() 一起使用。接受 C++1
我正在开发一个类 Timer它的一些成员属于 high_resolution_clock::time_point 类型其中 time_point定义为 typedef chrono::time_poi
我发现了以下问题。我有一个带时间的字符串(从我使用反向操作输出的文件中获取)。但是,当将其转换为 time_point 并将其输出到终端时,我发现相差一小时。我一直无法找出原因。有什么想法吗? #in
我不明白为什么这段代码会被 g++ 4.7.2 卡住: #include main () { std::chrono::system_clock::time_point t1, t2 ;
如果我有一个 std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now(); 变量,我如何定义另一个 time
我正在转换 std::chrono::time_point使用 的时间戳 std::chrono::duration_cast( getTimestamp().time_since_epoch()
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何仅更改现有 std::chrono::system_clock::time_point 的小时? 例如,假设我想实现这个功能: void set_hour(std::chrono::system_
如何从 std::chrono::system_clock::time_point 设置平台(windows、linux、android)的系统时间。 最佳答案 您不能使用 std::chrono 工
我在 12 天前发布了关于将 std::chrono::time_point 转换为字符串的问题并解决了问题。我想对你说声谢谢。 我使用以下代码解决了我的问题: char no[15]; string
我需要在 C++ 中获取当前日期和时间。我可以使用 chrono 来获取 系统时间 但我还需要将其作为字符串保存在 json 文件中。此外,我尝试过的计时时间格式如下: auto time = std
我对这些库还是很陌生,我可以在 std::chrono 上找到的文档对我不起作用。 我正在尝试实现一个包含时间戳的对象容器。这些对象都将按从最近到最不最近的顺序存储,我决定尝试使用 std::chro
我是一名优秀的程序员,十分优秀!