Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C++将时间戳转换为格式化日期时间 我只能使用C++标准库C++ 14来将时间戳转换为给定的格式日期时间。我对C++很熟悉,我知道C++不支持通过java之类的库来支持我们。 在中欧时区CET 2011-03-10 11:23:56的给定日期和时间,以下 将生成标准格式输出:2011-03-10T11:23:56.123+0100_C++_Timestamp_C++14_Chrono_Formatdatetime - Fatal编程技术网

使用C++将时间戳转换为格式化日期时间 我只能使用C++标准库C++ 14来将时间戳转换为给定的格式日期时间。我对C++很熟悉,我知道C++不支持通过java之类的库来支持我们。 在中欧时区CET 2011-03-10 11:23:56的给定日期和时间,以下 将生成标准格式输出:2011-03-10T11:23:56.123+0100

使用C++将时间戳转换为格式化日期时间 我只能使用C++标准库C++ 14来将时间戳转换为给定的格式日期时间。我对C++很熟悉,我知道C++不支持通过java之类的库来支持我们。 在中欧时区CET 2011-03-10 11:23:56的给定日期和时间,以下 将生成标准格式输出:2011-03-10T11:23:56.123+0100,c++,timestamp,c++14,chrono,formatdatetime,C++,Timestamp,C++14,Chrono,Formatdatetime,这是一个有点棘手的问题,因为: 没有明确说明输入是什么。但从示例代码中,我将假设std::chrono::system\u clock::time\u point 重要的是要认识到中欧时区CET被定义为。有些地理区域全年都遵循这一时区规则,有些则不然。而且没有人一直遵循它。无论如何,这部分问题允许我们硬编码所涉及的UTC偏移量:1h。无需进行日光节约调整 在C++14中,有两种方法可以做到这一点,而不涉及受版权保护的第三方开源软件: 使用C API 你自己滚吧 1的问题在于它容易出错。它不能直接

这是一个有点棘手的问题,因为:

没有明确说明输入是什么。但从示例代码中,我将假设std::chrono::system\u clock::time\u point

重要的是要认识到中欧时区CET被定义为。有些地理区域全年都遵循这一时区规则,有些则不然。而且没有人一直遵循它。无论如何,这部分问题允许我们硬编码所涉及的UTC偏移量:1h。无需进行日光节约调整

在C++14中,有两种方法可以做到这一点,而不涉及受版权保护的第三方开源软件:

使用C API

你自己滚吧

1的问题在于它容易出错。它不能直接处理毫秒精度。它不直接处理特定的时区,如CET。C API只知道UTC和计算机本地设置的时区。但这些问题是可以克服的

2的问题在于,它涉及到从std::chrono::system_clock::time_point提取年、月和日字段的非直观算法

尽管2存在问题,但这是我更喜欢的解决方案,我将在下面介绍。我还将展示C++20如何使这变得更容易

在所有解决方案中,我将通过实现以下形式的函数来形式化输入和输出:

std::string format_CET(std::chrono::system_clock::time_point tp);
推出自己的C++14 有六个独立的步骤。它将需要这些标题,而不需要其他标题:

#include <chrono>
#include <string>
#include <iomanip>
#include <iostream>
#include <limits>
#include <sstream>
函数本地使用指令便于将UDL h纳入范围,以及该函数中需要的所有其他内容:

using namespace std::chrono;
B.获得时间点tp的两种变化:一种为毫秒精度,另一种为日精度:

// Get time_points with both millisecond and day precision
auto tp_ms = time_point_cast<milliseconds>(tp);
auto tp_d = time_point_cast<days>(tp_ms);
C.要从tpu d获取年、月和日字段,可以方便地使用其中一个。这不是第三方库。它是编写自己的Calnordic库的算法,这正是我在解释中的内容。我已经定制了civil_from_days算法,以准确地解决格式的需求:

E.获取小时、分钟、秒和毫秒字段:

// Get {h, M, s, ms} from milliseconds since midnight
auto h = duration_cast<hours>(ms);
ms -= h;
auto M = duration_cast<minutes>(ms);
ms -= M;
auto s = duration_cast<seconds>(ms);
ms -= s;
使用操纵器setw的组合来设置每个字段的宽度,填充字符为0,可以获得所需的前导零

C++20解决方案 在C++20规范中,这要容易得多:

std::string
format_CET(std::chrono::system_clock::time_point tp)
{
    using namespace std::chrono;
    static auto const CET = locate_zone("Etc/GMT-1");
    return std::format("{:%FT%T%z}", zoned_time{CET, floor<milliseconds>(tp)});
}
此预览确实适用于C++14。在C++17及更高版本中,分区时间可以简化为仅分区时间

自定义时区支持 还有一种方法可以使用预览库,这样就不需要安装。它将成为一个只包含标题的库。这是通过创建一个只模拟CET的自定义时区来完成的,然后在分区时间内安装它。以下是自定义时区的外观:

#include "date/tz.h"

class CET
{
public:

    template <class Duration>
        auto
        to_local(date::sys_time<Duration> tp) const
        {
            using namespace date;
            using namespace std::chrono;
            return local_time<Duration>{(tp + 1h).time_since_epoch()};
        }

    template <class Duration>
        auto
        to_sys(date::local_time<Duration> tp) const
        {
            using namespace date;
            using namespace std::chrono;
            return sys_time<Duration>{(tp - 1h).time_since_epoch()};
        }

    template <class Duration>
        date::sys_info
        get_info(date::sys_time<Duration>) const
        {
            using namespace date;
            using namespace std::chrono;
            return {ceil<seconds>(sys_time<milliseconds>::min()),
                    floor<seconds>(sys_time<milliseconds>::max()),
                    1h, 0min, "CET"};
        }

    const CET* operator->() const {return this;}
};
此选项也在C++20规范中,其优点是在您的问题中未使用的时区缩写将正确报告CET而不是+01

更多关于自定义时区的文档可以找到

使用这些解决方案中的任何一种,现在都可以这样执行该功能:

#include <iostream>

int
main()
{
    std::cout << format_CET(std::chrono::system_clock::now()) << '\n';
}
2019-10-29T16:37:51.217+0100

这是一个有点棘手的问题,因为:

没有明确说明输入是什么。但从示例代码中,我将假设std::chrono::system\u clock::time\u point

重要的是要认识到中欧时区CET被定义为。有些地理区域全年都遵循这一时区规则,有些则不然。而且没有人一直遵循它。无论如何,这部分问题允许我们硬编码所涉及的UTC偏移量:1h。无需进行日光节约调整

在C++14中,有两种方法可以做到这一点,而不涉及受版权保护的第三方开源软件:

使用C API

你自己滚吧

1的问题在于它容易出错。它不能直接处理毫秒精度。它不直接处理特定的时区,如CET。C API只知道UTC和计算机本地设置的时区。但这些问题是可以克服的

2的问题在于,它涉及到从std::chrono::system_clock::time_point提取年、月和日字段的非直观算法

尽管2存在问题,但这是我更喜欢的解决方案,我将在下面介绍。我还将展示C++20如何使这变得更容易

在所有解决方案中,我将通过实现以下形式的函数来形式化输入和输出:

std::string format_CET(std::chrono::system_clock::time_point tp);
推出自己的C++14 有六个独立的步骤。它将需要这些标题,而不需要其他标题:

#include <chrono>
#include <string>
#include <iomanip>
#include <iostream>
#include <limits>
#include <sstream>
函数 cal using指令可方便地将UDL h纳入范围,以及此功能中需要的所有其他内容:

using namespace std::chrono;
B.获得时间点tp的两种变化:一种为毫秒精度,另一种为日精度:

// Get time_points with both millisecond and day precision
auto tp_ms = time_point_cast<milliseconds>(tp);
auto tp_d = time_point_cast<days>(tp_ms);
C.要从tpu d获取年、月和日字段,可以方便地使用其中一个。这不是第三方库。它是编写自己的Calnordic库的算法,这正是我在解释中的内容。我已经定制了civil_from_days算法,以准确地解决格式的需求:

E.获取小时、分钟、秒和毫秒字段:

// Get {h, M, s, ms} from milliseconds since midnight
auto h = duration_cast<hours>(ms);
ms -= h;
auto M = duration_cast<minutes>(ms);
ms -= M;
auto s = duration_cast<seconds>(ms);
ms -= s;
使用操纵器setw的组合来设置每个字段的宽度,填充字符为0,可以获得所需的前导零

C++20解决方案 在C++20规范中,这要容易得多:

std::string
format_CET(std::chrono::system_clock::time_point tp)
{
    using namespace std::chrono;
    static auto const CET = locate_zone("Etc/GMT-1");
    return std::format("{:%FT%T%z}", zoned_time{CET, floor<milliseconds>(tp)});
}
此预览确实适用于C++14。在C++17及更高版本中,分区时间可以简化为仅分区时间

自定义时区支持 还有一种方法可以使用预览库,这样就不需要安装。它将成为一个只包含标题的库。这是通过创建一个只模拟CET的自定义时区来完成的,然后在分区时间内安装它。以下是自定义时区的外观:

#include "date/tz.h"

class CET
{
public:

    template <class Duration>
        auto
        to_local(date::sys_time<Duration> tp) const
        {
            using namespace date;
            using namespace std::chrono;
            return local_time<Duration>{(tp + 1h).time_since_epoch()};
        }

    template <class Duration>
        auto
        to_sys(date::local_time<Duration> tp) const
        {
            using namespace date;
            using namespace std::chrono;
            return sys_time<Duration>{(tp - 1h).time_since_epoch()};
        }

    template <class Duration>
        date::sys_info
        get_info(date::sys_time<Duration>) const
        {
            using namespace date;
            using namespace std::chrono;
            return {ceil<seconds>(sys_time<milliseconds>::min()),
                    floor<seconds>(sys_time<milliseconds>::max()),
                    1h, 0min, "CET"};
        }

    const CET* operator->() const {return this;}
};
此选项也在C++20规范中,其优点是在您的问题中未使用的时区缩写将正确报告CET而不是+01

更多关于自定义时区的文档可以找到

使用这些解决方案中的任何一种,现在都可以这样执行该功能:

#include <iostream>

int
main()
{
    std::cout << format_CET(std::chrono::system_clock::now()) << '\n';
}
2019-10-29T16:37:51.217+0100

你试过什么?什么不起作用?堆栈溢出不是家庭作业编写服务。如果不是作业,只使用C++ 20的日期库,也许在这里也有用。@ AlanBirtles,C++ C++标准库14,你认为他可以使用一个甚至没有完全实现的C++标准吗?看起来你想输出ISO 8601格式的时间戳。如果是真的,这里应该有一些解决办法:@eike我确实读过这个问题,我试图说服他,除非他在做作业,否则他应该改变立场,让其他人使用图书馆为他做工作。你尝试过什么?什么不起作用?堆栈溢出不是家庭作业编写服务。如果不是作业,只使用C++ 20的日期库,也许在这里也有用。@ AlanBirtles,C++ C++标准库14,你认为他可以使用一个甚至没有完全实现的C++标准吗?看起来你想输出ISO 8601格式的时间戳。如果是真的,这里应该有一些解决办法:@eike我确实读过这个问题,我试图说服他,除非他在做作业,否则他应该改变立场,让其他人通过使用图书馆来为他做这项工作。非常清楚,可以理解,先生,非常感谢。接下来我必须做的是格式化输出流。你对我有什么建议吗?有。请参阅我的答案的副标题Roll your own C++14下的F段。您如何看待头文件中定义的strftime函数。因为我的输入格式语法与Java的SimpleDataFormat相同,所以你认为这个函数可以做我现在正在尝试的事情吗?实际上,我正在尝试做的就像Java名称SimpleDataFormat中的库一样。输入是时间戳字符串和格式字符串。输出将是格式化的日期。我也是一个C++新手。我也编辑了我的帖子。你的问题很有趣。strftime可以处理大部分问题,但不是全部。strftime的精度限制为1s。它不支持时区名称,但支持时区缩写和时区UTC偏移量。标准不保证对后两者的支持。然而,由于您只需要处理CET,这不应该是一个重大障碍,因为您可以硬编码名称和偏移量。您还可以编写自定义代码,将毫秒字段放置在任何需要的位置。没有任何东西可以直接替代Java的SimpleDataFormat。非常清晰易懂,非常感谢。接下来我必须做的是格式化输出流。你对我有什么建议吗?有。请参阅我的答案的副标题Roll your own C++14下的F段。您如何看待头文件中定义的strftime函数。因为我的输入格式语法与Java的SimpleDataFormat相同,所以你认为这个函数可以做我现在正在尝试的事情吗?实际上,我正在尝试做的就像Java名称SimpleDataFormat中的库一样。输入是时间戳字符串和格式字符串。输出将是格式化的日期。我也是一个C++新手。我也编辑了我的帖子。你的问题很有趣。strftime可以处理大部分问题,但不是全部。strftime的精度限制为1s。它不支持时区名称,但支持时区缩写和时区UTC偏移量。标准不保证对后两者的支持 . 然而,由于您只需要处理CET,这不应该是一个重大障碍,因为您可以硬编码名称和偏移量。您还可以编写自定义代码,将毫秒字段放置在任何需要的位置。Java的SimpleDataFormat没有直接的替代品。
2019-10-29T16:37:51.217+0100