C++ 如何在C+中获取自历元以来的本地当前时间(以秒为单位)+;(MSV)?
我需要本地(带时区偏移)当前时间,以秒为单位,从epoch开始。下面的代码看起来有点笨拙,因为它创建了一个多余的中间临时结构tm。为什么我必须获取时间,然后将其转换为tm才能返回到时间?有更好的办法吗C++ 如何在C+中获取自历元以来的本地当前时间(以秒为单位)+;(MSV)?,c++,c,visual-studio,C++,C,Visual Studio,我需要本地(带时区偏移)当前时间,以秒为单位,从epoch开始。下面的代码看起来有点笨拙,因为它创建了一个多余的中间临时结构tm。为什么我必须获取时间,然后将其转换为tm才能返回到时间?有更好的办法吗 time_t ct = time(0); tm lct = tm(); localtime_s(&lct, &ct); ct = _mkgmtime(&lct); 如果您想在portable C中获取本地时间(应用时区和DST),那么是的,这通常是一个两步过程:从纪元开始
time_t ct = time(0);
tm lct = tm();
localtime_s(&lct, &ct);
ct = _mkgmtime(&lct);
如果您想在portable C中获取本地时间(应用时区和DST),那么是的,这通常是一个两步过程:从纪元开始,首先调用
localtime
,然后对结果进行分解struct tm
。(通常我接下来要做的是调用strftime
)
您还可以调用ctime
直接获取本地时间字符串
有很多不同函数调用的原因是,不幸的是,有几种不同的时间格式在使用。(原因是日期和时间很复杂!)自1970年以来,你可以用秒来表示时间。您可以将其表示为struct tm
。您可以将其表示为字符串(多种格式中的一种)。在Unix和Linux中,可以将其表示为struct timeval
或struct timespec
但有一件事并没有一个简单或标准的方法可以做到,正如你所发现的,那就是从1970年开始,以秒为单位计算当地时间。但原因是它不是一个非常有用的表示。通常,您可能希望对日期/时间值执行两件事:(1)对其执行计算或(2)向用户显示它。如果您想向用户显示它,您可能希望以本地时间显示它,因此有很多方法可以以您想要的任何格式以人类可读的格式转换为本地时间。(正如我所说,通常的方法是调用localtime
,然后调用strftime
),但如果您想执行计算,唯一的方法是在UTC中使用1970年以来的秒数,因为这会消除所有其他棘手的问题。一个月有多少天?这是闰年吗?我们在哪个时区?夏令时有效吗
不过,如果你试图用1970年以来的秒数来表示当地时间,你可能是在撒谎。例如,现在的时间是1460383736,即UTC的14:08:56。我现在坐的是美国东部时间10:08:56(美国东部时间,实际上是美国东部时间)。所以我想我可以说这是自1970年当地时间以来的1460369336秒。但是,在我坐的地方,1460369336秒前不是1970年1月1日的午夜——实际上是1969年12月31日的晚上11点。它关闭了一个小时,原因是DST在1970年1月1日没有生效
所以,底线是,我鼓励你重新思考处理本地时间的方式,因为虽然可以计算这个“自1970年以来的秒数为本地时间”值,但这是一件奇怪的事情,它可能会给你带来各种各样的问题,比使用更直接的方案更难解决
但是,如果您确实愿意,这里有两种方法可以确定UTC和本地时间之间的偏移量,而无需调用
gmtime
或\mkgmtime
:
localtime
,查看tm\u gmtoff
字段。(遗憾的是,此字段不标准,并非所有系统都存在。)ftime
函数,查看struct timeb
的timezone
字段。(这里有几个问题:不仅是ftime
过时和不标准,而且timezone
字段以分钟为单位,格林威治以西的区域为正,而tmgmtoff
为负。)但是,无论如何,这些都会或多或少地直接给你一个数字,从你的UTC秒数(自1970年起)中加上或减去,得到“本地”秒数(自1970年起)。如果你想用便携式C获得本地时间(应用时区和DST),那么是的,这通常是一个两步程序:从你的历元开始计算时间,首先调用
localtime
,然后对结果进行分解struct tm
。(通常我接下来要做的是调用strftime
)
您还可以调用ctime
直接获取本地时间字符串
有很多不同函数调用的原因是,不幸的是,有几种不同的时间格式在使用。(原因是日期和时间很复杂!)自1970年以来,你可以用秒来表示时间。您可以将其表示为struct tm
。您可以将其表示为字符串(多种格式中的一种)。在Unix和Linux中,可以将其表示为struct timeval
或struct timespec
但有一件事并没有一个简单或标准的方法可以做到,正如你所发现的,那就是从1970年开始,以秒为单位计算当地时间。但原因是它不是一个非常有用的表示。通常,您可能希望对日期/时间值执行两件事:(1)对其执行计算或(2)向用户显示它。如果您想向用户显示它,您可能希望以本地时间显示它,因此有很多方法可以以您想要的任何格式以人类可读的格式转换为本地时间。(正如我所说,通常的方法是调用localtime
,然后调用strftime
),但如果您想执行计算,唯一的方法是在UTC中使用1970年以来的秒数,因为这会消除所有其他棘手的问题。一个月有多少天?这是闰年吗?我们在哪个时区?夏令时有效吗
不过,如果你试图用1970年以来的秒数来表示当地时间,你可能是在撒谎。例如,现在的时间是1460383736,即UTC的14:08:56。我在哪里
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std;
using namespace std::chrono;
auto now = floor<seconds>(system_clock::now());
auto s = current_zone()->to_local(now) - local_days{1970_y/jan/1};
cout << s.count() << '\n';
}
auto now = make_zoned(current_zone(), floor<seconds>(system_clock::now()));
auto str = format("%F %T %z", now);
2016-04-11 11:42:50 -0400
floor<milliseconds>(system_clock::now());
2016-04-11 11:42:50.368 -0400