Java到C++;UTC时间-以秒为单位查找UTC区域时间偏移 我需要使用UnCals字符的纯ByteBuffer的最小长度来将UTC日期时间实例从java序列化到C++。 我需要的时间点能够支持最小纳秒精度

Java到C++;UTC时间-以秒为单位查找UTC区域时间偏移 我需要使用UnCals字符的纯ByteBuffer的最小长度来将UTC日期时间实例从java序列化到C++。 我需要的时间点能够支持最小纳秒精度,c++,utc,chrono,C++,Utc,Chrono,从java方面看,我查看了ZonedDateTime和OffsetDateTime类,了解了它们用于存储时间的原语类型,总共相当于17个字节,这是一个很大的数目 请注意,我在这里不传输区域本身,因为我还没有找到将这些区域字符串从IANA映射到整数的方法。因此,我想区域偏移量就足够了。由于买方必须在将其时间点发送到服务器之前将其转换为特定的偏移量,因此可以假定为UTC 0。我正在寻找一个解决方案,这是奇怪的当地时间,即没有NTP服务器参与 java方面如下所示: // 4 byte

从java方面看,我查看了ZonedDateTime和OffsetDateTime类,了解了它们用于存储时间的原语类型,总共相当于17个字节,这是一个很大的数目

请注意,我在这里不传输区域本身,因为我还没有找到将这些区域字符串从IANA映射到整数的方法。因此,我想区域偏移量就足够了。由于买方必须在将其时间点发送到服务器之前将其转换为特定的偏移量,因此可以假定为UTC 0。我正在寻找一个解决方案,这是奇怪的当地时间,即没有NTP服务器参与

java方面如下所示:

        // 4 byte
        Integer year = offsetDateTime.getYear();
        // 1 byte           
        Integer month = offsetDateTime.getMonthValue();
        // 1 byte
        Integer day = offsetDateTime.getDayOfMonth();
        // 1 byte
        Integer hour = offsetDateTime.getHour();
        // 1 byte
        Integer minutes = offsetDateTime.getMinute();
        // 1 byte
        Integer seconds = offsetDateTime.getSecond();
        // 4 byte
        Integer nanoSeconds = offsetDateTime.getNano();
        // 4 byte
        Integer utcZoneTimeTotalSecondsOffset = offsetDateTime.getOffset().getTotalSeconds(); 
在C++方面,我需要做同样的事情,并且能够从上面所有的整数中构造一个时间点。 我已经找到了如何获取除utcOffset(即最后一个整数)之外的上述信息

我想使用chrono来使用这个缓冲区并从中实例化一个时间点。然而,我无法找到一种方法来获得C++中的时间偏移。如何使用chrono获取时间偏移量,然后根据上述信息构造时间点

auto now = std::chrono::system_clock::now();
time_t itt = std::chrono::system_clock::to_time_t(now);

tm utc_tm = *gmtime(&itt);

std::cout << utc_tm.tm_year + 1900 << '-';
std::cout << utc_tm.tm_mon + 1 << '-';
std::cout << utc_tm.tm_mday << ' ';
std::cout << utc_tm.tm_hour << ':';
std::cout << utc_tm.tm_min << ':';
std::cout << utc_tm.tm_sec << '\n';

? wher is the time zoneOffset here ?

这给了我错误的信息。至少对我来说是这样。所以我相信GMTOFF不是走的路,但是如果GMTOF不是这样,那么什么是?

< P>不是一个完整的答案,但是这里有一种方法可以使用./P>序列化C++本地时间点。 这是我当前的本地日期/时间和时区缩写

接下来,程序将其转换为包含少量(但不一定最少)ASCII字符的字符串,以完全描述本地时间点。我选择了以下格式:

<Number of nanoseconds since epoch> <IANA time zone name>
字符串
to_string
中形成,它只是将
分区时间
的系统时间的“时间自历元”流出来。然后添加一个空格,并输出时区的名称

from_string
通过读取纳秒数,然后读取时区名称来反转此操作。然后,它通过将时区名称配对,并与解析的整数形成一个
sys\u time
来形成一个
zoned\u time

main
打印解析后的
分区时间
,以确保我们的往返行程减少损失:

2019-09-11 12:37:04.846272000 EDT

为了获得包含本地时间的无损耗转换,确实需要传输IANA时区名称,而不仅仅是当前UTC偏移量。仅使用UTC偏移量,就可以恢复准确的UTC时间点。但人们无法执行任何本地时间算法,或与其他本地时间点进行比较,因为人们无法知道更改UTC偏移量时的规则。只有使用完整的IANA时区名称才能传递关于这些规则的信息。

看起来像在C++中,我们没有时区。直到C++ 20使用时区是具体的,在它看起来应该是UTC之后。在C++中,最终的产品是UTC时间点,或者是本地时间点。只要时间点大约在1678到2262的范围内,就可以用总共8字节来表示C++中的毫微秒精度的UTC时间点。如果一个人需要时区或UTC偏移,那就需要更多的存储空间。为什么要处理偏移?只需使用UTC ZoneId创建OffsetDateTime或ZonedDateTime。如果所有客户端/服务器始终以UTC相互通信,则比较时间戳变得非常容易。当然,除非出于某种原因,人们必须知道时间戳是否在客户机/服务器的打开/关闭本地时间。霍华德,非常感谢您的回复,还有一件事,您知道是否有办法将区域“America/New_York”的字符串映射为整数吗?出于这个原因,我试图避免序列化的字符串表示,而是使用固定长度的整数。因为我希望有一个相同的DTO java和C++作为一个结构来交换信息。还有一个问题是,您知道“date/tz.h”以前是否已经用Webassembly进行过测试?没有正式的nameinteger映射。然而,你可以创建自己的。目前有593个名称与时区关联。其中一些名称实际上指的是同一个区域,但大多数操作系统将它们视为区域的不同副本。我不知道tz.h在Webassembly中有任何用途。
2019-09-11 12:37:04.846272000 EDT
<Number of nanoseconds since epoch> <IANA time zone name>
1568219824846272000 America/New_York
2019-09-11 12:37:04.846272000 EDT