1// Copyright 2013 Vicente J. Botet Escriba
2// Distributed under the Boost Software License, Version 1.0.
3// See http://www.boost.org/LICENSE_1_0.txt
4// See http://www.boost.org/libs/chrono for documentation.
5
6#define BOOST_CHRONO_VERSION 2
7//#define BOOST_CHRONO_PROVIDES_DATE_IO_FOR_SYSTEM_CLOCK_TIME_POINT 1
8
9#include <sstream>
10#include <iostream>
11#include <boost/chrono/chrono_io.hpp>
12#include <boost/chrono/floor.hpp>
13#include <boost/chrono/round.hpp>
14#include <boost/chrono/ceil.hpp>
15#include <boost/detail/lightweight_test.hpp>
16#include <cstdio>
17
18int main()
19{
20 using namespace boost;
21 using namespace boost::chrono;
22 boost::chrono::system_clock::time_point atnow= boost::chrono::system_clock::now();
23 {
24 std::stringstream strm;
25 std::stringstream strm2;
26 // does not change anything: strm<<time_fmt(boost::chrono::timezone::utc);
27 // does not change anything: strm2<<time_fmt(boost::chrono::timezone::utc);
28 boost::chrono::system_clock::time_point atnow2;
29 strm<<atnow<<std::endl;
30 time_t t = boost::chrono::system_clock::to_time_t(t: atnow);
31 std::cout << "A:" << std::endl;
32 std::puts(s: ctime(timer: &t));
33 std::cout << "A:" << std::endl;
34 std::cout << "A:" << strm.str()<< std::endl;
35 std::cout << "A:" << atnow.time_since_epoch().count() << std::endl;
36 strm>>atnow2;
37 strm2<<atnow2<<std::endl;
38 std::cout << "B:" << strm2.str()<< std::endl;
39 std::cout << "B:" << atnow2.time_since_epoch().count()<< std::endl;
40 BOOST_TEST_EQ(atnow.time_since_epoch().count(), atnow2.time_since_epoch().count());
41
42 // 1 sec wrong:
43 std::cout << "diff:" << boost::chrono::duration_cast<microseconds>(fd: atnow2 - atnow).count() <<std::endl;
44 BOOST_TEST_EQ(boost::chrono::duration_cast<microseconds>(atnow2 - atnow).count(), 0);
45 std::stringstream formatted;
46 formatted << time_fmt(tz: boost::chrono::timezone::utc, fmt: "%Y-%m-%d %H:%M:%S");
47 formatted << "actual:"<< atnow <<std::endl;
48 formatted << "parsed:"<< atnow2 <<std::endl;
49 std::cout << formatted.str();
50 std::stringstream formatted1;
51 formatted1 << time_fmt(tz: boost::chrono::timezone::utc, fmt: "%Y-%m-%d %H:%M:%S");
52 formatted1 << atnow ;
53 std::stringstream formatted2;
54 formatted2 << time_fmt(tz: boost::chrono::timezone::utc, fmt: "%Y-%m-%d %H:%M:%S");
55 formatted2 << atnow2 ;
56 BOOST_TEST_EQ(formatted1.str(), formatted2.str());
57
58
59 }
60
61 {
62 std::cout << "FORMATTED" << std::endl;
63 std::stringstream strm;
64 std::stringstream strm2;
65 boost::chrono::system_clock::time_point atnow2;
66 // the final second mark is always parsed as 01
67 strm<<time_fmt(tz: boost::chrono::timezone::utc, fmt: "%Y-%m-%d %H:%M:%S");
68 strm2<<time_fmt(tz: boost::chrono::timezone::utc, fmt: "%Y-%m-%d %H:%M:%S");
69 strm<<atnow<<std::endl;
70 std::cout << "actual:" << strm.str()<< std::endl;
71 strm>>atnow2;
72 strm2<<atnow2<<std::endl;
73 // the final second mark is always parsed as 01
74 std::cout << "parsed:" << strm2.str()<< std::endl;
75 //BOOST_TEST_EQ(atnow, atnow2); // fails because the pattern doesn't contains nanoseconds
76 //BOOST_TEST_EQ(atnow.time_since_epoch().count(), atnow2.time_since_epoch().count()); // fails because the pattern doesn't contains nanoseconds
77 BOOST_TEST_EQ(boost::chrono::duration_cast<seconds>(atnow2 - atnow).count(), 0);
78
79 }
80 return boost::report_errors();
81}
82

source code of boost/libs/chrono/test/test_7868.cpp