I have been having some difficulty initializing a chrono::system_clock::time_point object. Specifically,
I am trying to load a time stamp from a .pcap file using libpcap. I have a structure, pcap_pkthdr,
which contains two fields:
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
struct pcap_pkthdr {
struct timeval ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
Where tv_sec and tv_usec are seconds and microseconds respectively relative to an epoch
of Jan 1, 1970. I can use system_clock::from_time_t() to initialize the time_point to an 64-bit integer
seconds (std:time_t). The question is, how do I add the microseconds to this value? My latest attempt
is:
void my_class::calculate_packet_statistics( const struct pcap_pkthdr *header ) {
frame_interval_.intervalTimeStamp_ = system_clock::from_time_t( static_cast<time_t>( header->ts.tv_sec ) );
frame_interval_.intervalTimeStamp_ += microseconds( header->ts.tv_usec ); // This is the problematic line
…
}
However, this appears to simply add tv_usec to the internal representation of the time_point. The internal
representation appears to be in 100ns ticks with an epoch other than Jan 1, 1970. This is on a windows x64
build but the same code will have to work on Linux as well.
As a side note, I later do some date calculations using system_clock::to_time_t. I lose my fractional seconds here
But since I am only working with dates, this is not a problem.
Dan Kelly
dan.kelly@sig.com