DST转换问题与时刻添加

时间:2015-10-30 15:01:57

标签: momentjs dst

我想在DST时区添加小时。正确添加小时数,但未识别DST时区。

示例:我正在添加4小时到“2015年10月31日星期六20:00:00 GMT-0400”,这是(东部夏令时)。添加4小时后,我将收到“Sun Nov 01 2015 00:00:00 GMT-0400”。由于夏令时已于2015年11月1日结束,预期结果为“Sun Nov 01 2015 00:00:00 GMT-0500”。

在测试时将本地计算机时区设置为(UTC-05:00)美国东部时间(美国和加拿大)。

date::sys_seconds
parse(const std::string& str)
{
    std::istringstream in(str);
    date::sys_seconds tp;
    in >> date::parse("%FT%TZ", tp);
    if (in.fail())
    {
        in.clear();
        in.str(str);
        in >> date::parse("%FT%T%z", tp);
    }
    return tp;
}

int
main()
{
    using namespace date;
    std::cout << parse("2015-08-27T11:31:40+0100").time_since_epoch() << '\n';
    std::cout << parse("2015-08-27T10:31:40Z").time_since_epoch() << '\n';
}

-Jimit

2 个答案:

答案 0 :(得分:1)

  

“目前,夏令时从3月的第二个星期日开始   并在11月的第一个星期日结束,随着时间的变化而变化   当地时间凌晨2点。“

     

Daylight saving time in the UnitedStates.

事实上,您可以看到5到6小时轮班之间的夏令时变化。

答案 1 :(得分:0)

一些事情

  1. 请更新您的问题,以便在StackOverflow上显示您的代码。您应该只显示提出问题所需的部分。

  2. 在Plunker上查看您的代码,您应该更喜欢使用format而不是toString,但这不是问题的原因。

  3. 此外,您正在创建一个字符串,只是为了再次解析它,这是低效的,有时会导致错误。虽然这也不是原因。

  4. 主要问题是您假设DST在午夜结束于美国东部时区,而实际上在凌晨2:00结束。时钟将在1毫秒后从2015-11-01T01:59:59.999-04:00前进到2015-11-01T01:00:00.00-05:00

    时刻可以解决这个问题。

    example

  5. 请注意我突出显示的部分,显示由于DST回落而重复1:00小时的偏移。

相关问题