gpt4 book ai didi

c++ - 创建 CTime @ 2am 不返回正确的值(Windows CE、C++)

转载 作者:行者123 更新时间:2023-11-30 03:35:27 25 4
gpt4 key购买 nike

这违背了所有合理的逻辑,但是当我尝试构建一个包含“2”的小时 CTime 时,它​​将在小时字段中返回 1 而不是 2。仅针对此小时值。平台是WindowsCE 6.0,纯c++ (VS2005)

void main(void)
{
CTime myTime;
int myMonth;

for(myMonth=1; myMonth < 13; myMonth++)
{
myTime = CTime(2017, 03, 12, myMonth, 0, 0, 0);
printf("Month: %d", myMonth);
printf("\r");
printf("CTime: %d, %d, %d, %d, %d, %d", myTime.GetYear(), myTime.GetMonth(), myTime.GetDay(), myTime.GetHour(), myTime.GetMinute(), myTime.GetSecond());
printf("\r");
}
}

月份:1

CTime: 2017, 3, 12, 1, 0, 0

月份:2

CTime: 2017, 3, 12, 1, 0, 0//!!!

月份:3

CTime: 2017, 3, 12, 3, 0, 0

月份:4

CTime: 2017, 3, 12, 4, 0, 0

月份:5

CTime: 2017, 3, 12, 5, 0, 0

月份:6

CTime: 2017, 3, 12, 6, 0, 0

月份:7

CTime: 2017, 3, 12, 7, 0, 0

月份:8

CTime: 2017, 3, 12, 8, 0, 0

月份:9

CTime: 2017, 3, 12, 9, 0, 0

月份:10

CTime: 2017, 3, 12, 10, 0, 0

月份:11

CTime: 2017, 3, 12, 11, 0, 0

月份:12

CTime: 2017, 3, 12, 12, 0, 0

添加分钟和秒有效,但小时仍然不好。

nDST 可以是 -1、0 或 1,或省略(构造函数默认为 -1)它不会改变任何东西,如果输入 2,小时仍将设为 1。

非常令人沮丧。

此外,我还尝试了其他方法:

CTime    myCurrentTime = CTime::GetCurrentTime();   

你猜怎么着?如果确实是凌晨 2 点,此构造函数将正常工作并在小时中输入“2”。

-> 我目前正在扫描我构建的 DST 转换表,我需要构建一个时间引用以将其与当前时间进行比较,并决定我是采用表中的当前条目还是跳到下一个条目。

由于内存占用,使用任何外部插件库都不是解决方案。我坚持使用 CE 6.0 和 10 年前设计的电路板。如果有一个“vanilla”c++ 解决方案就好了。

最佳答案

实际上(假设是美国时区)时钟在 2017-03-12 02:00:00 跳向前,而不是向后跳,这使得 CTime 的输出非常奇怪.

假设使用现代编译器(例如 VS-2013 或更好),here is a C++11/14 library这可以用来澄清情况。

#include "chrono_io.h"
#include "tz.h"
#include <iostream>
#include <exception>

int
main()
{
try
{
using namespace date;
using namespace std::chrono_literals;;
for (auto myHour = 1h; myHour < 13h; ++myHour)
{
auto myTime = make_zoned(current_zone(),
local_days{2017_y/mar/12} + myHour);
std::cout << "Hour: " << myHour << '\n';
std::cout << "Time: " << myTime << '\n';
}
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}

我试图保留原始程序的结构,但我更改了一些误导性的变量名称和标签。

这个程序的输出(在美国时区的计算机上运行)是:

Hour: 1h
Time: 2017-03-12 01:00:00 EST
2017-03-12 02:00:00 is in a gap between
2017-03-12 02:00:00 EST and
2017-03-12 03:00:00 EDT which are both equivalent to
2017-03-12 07:00:00 UTC

上面错误信息中提到的“gap”是本地时间的半开范围,包括开始,但不包括结束([2:00:00, 3:00:00)).

错误消息说明出了什么问题,但没有说明如果您不希望出现异常,该如何解决。如果您不想出现异常,您可以稍微更改上述程序以“预先决定”您希望如何处理本地时间的不连续性。

如果本地时间不明确(在同一日期出现两次),您可以指定您想要更早或更晚的时间。这发生在(例如)从夏令时过渡到标准时。当从标准时间转换为夏令时时,本地时间会向前跳转(通常会跳过一个小时)。当这种情况发生时,间隙的两侧对应于同一时刻。由于时差是半开的,因此据说本地时间从 1:59:59.999999 跳到(例如)3:00:00。

在“spring-forward”场景中,您可以指定您想要“较早”或“较晚”映射,并且两者都映射到位于间隙两侧的 UTC 即时,当转换回本地时本例中时间为 3:00:00。

在代码中是这样的:

#include "chrono_io.h"
#include "tz.h"
#include <iostream>
#include <exception>

int
main()
{
try
{
using namespace date;
using namespace std::chrono_literals;;
for (auto myHour = 1h; myHour < 13h; ++myHour)
{
auto myTime = make_zoned(current_zone(),
local_days{2017_y/mar/12} + myHour,
choose::earliest); // only change
std::cout << "Hour: " << myHour << '\n';
std::cout << "Time: " << myTime << '\n';
}
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}

和输出:

Hour: 1h
Time: 2017-03-12 01:00:00 EST
Hour: 2h
Time: 2017-03-12 03:00:00 EDT
Hour: 3h
Time: 2017-03-12 03:00:00 EDT
Hour: 4h
Time: 2017-03-12 04:00:00 EDT
Hour: 5h
Time: 2017-03-12 05:00:00 EDT
Hour: 6h
Time: 2017-03-12 06:00:00 EDT
Hour: 7h
Time: 2017-03-12 07:00:00 EDT
Hour: 8h
Time: 2017-03-12 08:00:00 EDT
Hour: 9h
Time: 2017-03-12 09:00:00 EDT
Hour: 10h
Time: 2017-03-12 10:00:00 EDT
Hour: 11h
Time: 2017-03-12 11:00:00 EDT
Hour: 12h
Time: 2017-03-12 12:00:00 EDT

现在重复凌晨 3 点,而不是凌晨 1 点 (CTime),但至少您知道原因,并默认获得有关它的详细错误消息。

处理本地时间的所有诡计可能是一件棘手的事情,但是 this library可以帮你处理。顺便说一句,我们有一个 leap second几天后出现。 This library如果它对您的时间计算很重要,也可以处理该细节。

视频介绍:https://www.youtube.com/watch?v=Vwd3pduVGKY

关于c++ - 创建 CTime @ 2am 不返回正确的值(Windows CE、C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com