微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C ++中获取当前时间

如何解决在C ++中获取当前时间

案例

我需要编写一个程序,以在配置文件中设置的时间移动文件。时间可以是00:00:01秒,直到24:00:00小时。这将转换为秒。因此,如果有人要在今天的12:00:00 pm移动文件,则移动时间为12 * 60 * 60 = 43200秒。这是每天完成的,程序需要检查是否已达到该时间。

我使用chrono库来获取从纪元开始使用以下时间的时间:

auto dayInSeconds = 86400;
auto currentTime = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock().Now().time_since_epoch());
auto timeWithoutDays = currentTime % dayInSeconds;

std::cout << "time in seconds today: " << timeWithoutDays.count() << std::endl;

问题

显示了自纪元以来的当前时间(以秒为单位)。但是现在例如(阿姆斯特丹时间13:45),它返回的数字为:42294。如果我在循环中恰好五秒钟后运行它,则返回42299。因此,计数似乎是正确的。不正确的是42299秒是1174小时(42299/60/60)。这应该意味着现在是11:AM,但现在是13:32 PM。或不?我究竟做错了什么?我只需要知道,从今天00:00:00开始经过了几秒钟。这样我就可以检查用户设置的时间是否过去了,并且需要完成一些工作。

出于各种原因,我想继续使用chrono库,但是主要是因为我了解这一点。因此,如果答案使用该库,那将是一个很大的帮助。我感觉自己在做一些完全愚蠢的事情。

修复

对于任何寻求相同答案的其他人。我像这样修复它,它似乎可以工作:

auto dayInSeconds = 86400;
auto amsterdamUTCPlusTime = 7200;
auto currentTime = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock().Now().time_since_epoch());
auto timeWithoutDays = currentTime % dayInSeconds;
auto currentTimeInSeconds = timeWithoutDays.count() + amsterdamUTCPlusTime;
std::cout << "time in seconds today: " << currentTimeInSeconds << std::endl;

解决方法

C ++ 20为<chrono>带来了扩展,以处理时区。据我所知,它还没有发货。但这是它的样子:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    zoned_time zt{"Europe/Amsterdam",floor<seconds>(system_clock::now())};
    auto lt = zt.get_local_time();
    auto tod = lt - floor<days>(lt);
    cout << "time in seconds today: " << tod.count() << '\n';
    cout << hh_mm_ss{tod} << '\n';
}

示例输出:

time in seconds today: 71923
19:58:43

如果您的计算机的本地时区设置已设置为“欧洲/阿姆斯特丹”,则可以将以上"Europe/Amsterdam"替换为current_zone()

这将获取以UTC为单位的当前时间,将其截断为秒精度,然后将其与“欧洲/阿姆斯特丹” time_zone配对以创建zoned_time。然后从zoned_time中提取本地时间。本地时间是本地时间减去该天的开始时间(floor<days>(lt))。这存储在类型为tod的{​​{1}}中。将其包装为seconds会以hh:mm:ss格式将其打印出来。

存在一个free,open-source C++20 <chrono> preview library,可以与C ++ 11/14/17一起使用来执行此操作。要使用它,它必须是installed。有一个要编译的源文件tz.cpp,它需要访问IANA time zone database,可以使用特定的构建设置自动下载该文件。

上面的源代码必须通过添加hh_mm_ss#include "date/tz.h"来简单地修改。在C ++ 11和14中,将using namespace date;更改为zoned_time,将zoned_seconds更改为hh_mm_ss

另一种可能性是仅针对阿姆斯特丹(假设当前规则)构建自己的UTC偏移量计算器。这样做的好处是它可以使用free,open-source C++20 <chrono> preview library的子集,该子集仅是标头,因此不需要安装,也不需要IANA time zone database。那可能是这样的:

hh_mm_ss<seconds>

此程序对以下事实进行了硬编码:阿姆斯特丹夏时制从3月的最后一个星期日的世界标准时间01:00:00开始,到10月的最后一个星期日的世界标准时间01:00:00结束。

之后,程序逻辑非常类似于上面显示的C ++ 20解决方案。在C ++ 11中,#include "date/date.h" #include <chrono> #include <iostream> int main() { using namespace date; using namespace std; using namespace std::chrono; auto AmsterdamOffset = [](system_clock::time_point tp) { auto const y = year_month_day{floor<days>(tp)}.year(); auto const start = sys_days{Sunday[last]/March/y} + 1h; auto const end = sys_days{Sunday[last]/October/y} + 1h; if (start <= tp && tp < end) return 2h; return 1h; }; auto now = floor<seconds>(system_clock::now()); auto local_now = now + AmsterdamOffset(now); auto tod = local_now - floor<days>(local_now); cout << "time in seconds today: " << tod.count() << '\n'; cout << hh_mm_ss{tod} << '\n'; } 1h必须分别更改为2hhours{1}

还有另一种方法:Posix时区

在ptz.h中还有一个Posix time zone library at this link。这也是一个仅标头的库,因此没有安装问题。它允许您结合使用C ++ 20 hours{2}Posix time zones。这将为您提供与上述示例相同的结果,并使用阿姆斯特丹的“硬编码”规则(有效期自1978年开始)。

zoned_time

以上假设使用C ++ 17。如果在C ++ 11或14中,语法变得有点混乱:

#include "date/ptz.h"
#include <chrono>
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    // Amsterdam rules
    Posix::time_zone tz{"CET-1CEST,M3.5.0,M10.5.0/3"};
    zoned_time zt{tz,floor<seconds>(system_clock::now())};
    auto lt = zt.get_local_time();
    auto tod = lt - floor<days>(lt);
    cout << "time in seconds today: " << tod.count() << '\n';
    cout << hh_mm_ss{tod} << '\n';
}

zoned_time<seconds,Posix::time_zone> zt{tz,floor<seconds>(system_clock::now())}; 不是C ++ 20 Posix::time_zone库的一部分,但与之兼容。可以将其与C ++ 20 <chrono>类模板一起使用,如上所示。

,

您可以使用localtime函数并从系统获取当前时间。

 int getIntTime()
 {
  struct timeb now;
  struct tm *curtime;
  curtime = localtime(&now);
  return(curtime->tm_hour * 10000L + curtime->tm_min * 100L + curtime->tm_sec);
 }

此外,您还应该将confgi文件中的设置时间转换为与该函数的输出相同的时间,并进行如下比较:

if(getIntTime()  >= converted_time_configfile )
{
   //do processing
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。