1/* Copyright (c) 2002,2003, 2007 CrystalClear Software, Inc.
2 * Use, modification and distribution is subject to the
3 * Boost Software License, Version 1.0. (See accompanying
4 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
5 * Author: Jeff Garland
6 */
7
8#include "boost/date_time/posix_time/posix_time.hpp"
9#include "boost/date_time/local_time_adjustor.hpp"
10#include "boost/date_time/local_timezone_defs.hpp"
11#include "../testfrmwk.hpp"
12
13int
14main()
15{
16 using namespace boost::posix_time;
17 using namespace boost::gregorian;
18
19 date dst_start(2002,Apr, 7);
20 date dst_end_day(2002,Oct, 27);
21
22 typedef boost::date_time::utc_adjustment<time_duration,-5> us_eastern_offset_adj;
23 //Type that embeds rules for UTC-5 plus DST offset
24 typedef boost::date_time::static_local_time_adjustor<ptime,
25 us_dst,
26 us_eastern_offset_adj> us_eastern;
27
28 //test some times clearly not in DST
29 date d3(2002,Feb,1);
30 ptime t10(d3, hours(4));
31 ptime t10_check(d3, hours(9)); //utc is 5 hours ahead
32 time_duration td = us_eastern::local_to_utc_offset(t: t10);//dst flag is defaulted
33 check(testname: "check local calculation", testcond: td == hours(5));
34 ptime t10_local = t10 + td;
35 std::cout << t10_local << std::endl;
36 check(testname: "check local calculation", testcond: t10_local == t10_check);
37 check(testname: "check utc is dst",
38 testcond: us_eastern::utc_to_local_offset(t: t10) == hours(-5));
39
40
41 //something clearly IN dst
42 date d4(2002,May,1);
43 ptime t11(d4, hours(3));
44 check(testname: "check local offset",testcond: us_eastern::local_to_utc_offset(t: t11) == hours(4));
45 std::cout << us_eastern::local_to_utc_offset(t: t11) << std::endl;
46 ptime t11_check(d4, hours(7));//now utc offset is only 4 hours
47 ptime t11_local = t11 + us_eastern::local_to_utc_offset(t: t11);
48 std::cout << t11_local << " " << t11_check << std::endl;
49 check(testname: "check local calculation", testcond: t11_local == t11_check);
50 //should get same offset with DST flag set
51 check(testname: "check local offset-dst flag on",
52 testcond: us_eastern::local_to_utc_offset(t: t11, dst: boost::date_time::is_dst) == hours(4));
53 check(testname: "check local offset-dst flag override",
54 testcond: us_eastern::local_to_utc_offset(t: t11, dst: boost::date_time::not_dst) == hours(5));
55
56
57 //Check the start of dst boundary
58 ptime l_not_dst(dst_start, time_duration(1,59,59)); //2002-Apr-07 01:59:59
59 check(testname: "check local dst start boundary case",
60 testcond: us_eastern::local_to_utc_offset(t: l_not_dst) == hours(5));
61 ptime u_not_dst(dst_start, time_duration(6,59,59));
62 check(testname: "check utc dst start boundary case",
63 testcond: us_eastern::utc_to_local_offset(t: u_not_dst) == hours(-5));
64 ptime l_in_dst(dst_start, hours(3)); //2002-Apr-07 03:00:00 1st sec of dst
65 check(testname: "check local dst start boundary case",
66 testcond: us_eastern::local_to_utc_offset(t: l_in_dst, dst: boost::date_time::is_dst) == hours(4));
67 ptime u_in_dst(dst_start, hours(7));
68 check(testname: "check utc dst start boundary case",
69 testcond: us_eastern::utc_to_local_offset(t: u_in_dst) == hours(-4));
70
71
72 //Check the end of dst boundary
73 ptime dst_end(dst_end_day, time_duration(1,59,59)); //2002-Oct-27 01:00:00 DST
74 check(testname: "check local dst end boundary case - still dst",
75 testcond: us_eastern::local_to_utc_offset(t: dst_end, dst: boost::date_time::is_dst) == hours(4));
76 check(testname: "check local dst end boundary case - still dst",
77 testcond: us_eastern::local_to_utc_offset(t: dst_end, dst: boost::date_time::not_dst) == hours(5));
78 ptime u_dst_end1(dst_end_day, time_duration(5,59,59));
79 check(testname: "check utc dst end boundary case",
80 testcond: us_eastern::utc_to_local_offset(t: u_dst_end1) == hours(-4));
81 ptime u_dst_end2(dst_end_day, time_duration(6,0,0));
82 check(testname: "check utc dst end boundary case",
83 testcond: us_eastern::utc_to_local_offset(t: u_dst_end2) == hours(-5));
84 ptime u_dst_end3(dst_end_day, time_duration(6,59,59));
85 check(testname: "check utc dst end boundary case",
86 testcond: us_eastern::utc_to_local_offset(t: u_dst_end3) == hours(-5));
87 ptime u_dst_end4(dst_end_day, time_duration(7,0,0));
88 check(testname: "check utc dst end boundary case",
89 testcond: us_eastern::utc_to_local_offset(t: u_dst_end4) == hours(-5));
90
91
92 //Now try a local adjustments without dst
93 typedef boost::date_time::utc_adjustment<time_duration,-7> us_az_offset_adj;
94 typedef boost::date_time::null_dst_rules<date, time_duration> us_az_dst_adj;
95 //Type that embeds rules for UTC-7 with no dst
96 typedef boost::date_time::static_local_time_adjustor<ptime,
97 us_az_dst_adj,
98 us_az_offset_adj> us_az;
99
100 check(testname: "check local offset - no dst",
101 testcond: us_az::local_to_utc_offset(t: t10) == hours(7));
102 check(testname: "check local offset - no dst",
103 testcond: us_az::local_to_utc_offset(t: t11) == hours(7));
104 check(testname: "check local offset - no dst",
105 testcond: us_az::utc_to_local_offset(t: t10) == hours(-7));
106 check(testname: "check local offset - no dst",
107 testcond: us_az::utc_to_local_offset(t: t11) == hours(-7));
108
109
110 //Arizona timezone is utc-7 with no dst
111 typedef boost::date_time::local_adjustor<ptime, -7, no_dst> us_arizona;
112
113 ptime t7(date(2002,May,31), hours(17));
114 ptime t8 = us_arizona::local_to_utc(t: t7);
115 ptime t9 = us_arizona::utc_to_local(t: t8);
116 //converted to local then back ot utc
117 check(testname: "check us_local_adjustor", testcond: t9 == t7);
118
119 typedef boost::date_time::local_adjustor<ptime, -5, us_dst> us_eastern2;
120
121 {
122 ptime t7a(date(2002,May,31), hours(17));
123 ptime t7b = us_eastern2::local_to_utc(t: t7a);
124 ptime t7c = us_eastern2::utc_to_local(t: t7b);
125 //converted to local then back ot utc
126 check(testname: "check us_local_adjustor", testcond: t7c == t7a);
127 }
128
129 typedef boost::date_time::us_dst_trait<date> us_dst_traits;
130 typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
131 us_dst_calc2;
132
133 typedef boost::date_time::local_adjustor<ptime, -5, us_dst_calc2> us_eastern3;
134 {
135 ptime t7a(date(2002,May,31), hours(17));
136 ptime t7b = us_eastern3::local_to_utc(t: t7a);
137 ptime t7c = us_eastern3::utc_to_local(t: t7b);
138 //converted to local then back ot utc
139 check(testname: "check us_local_adjustor3", testcond: t7c == t7a);
140 }
141
142 {
143 ptime t7a(date(2007,Mar,11), hours(4));
144 ptime t7b = us_eastern3::local_to_utc(t: t7a);
145 ptime t7c = us_eastern3::utc_to_local(t: t7b);
146 //converted to local then back ot utc
147 check(testname: "check us_local_adjustor3 2007", testcond: t7c == t7a);
148 }
149
150 {
151 ptime t7a(date(2007,Mar,11), hours(3));
152 ptime t7b = us_eastern3::local_to_utc(t: t7a);
153 ptime t7c = us_eastern3::utc_to_local(t: t7b);
154 //converted to local then back ot utc
155 check(testname: "check us_local_adjustor3 2007 a", testcond: t7c == t7a);
156 }
157
158 //still experimental
159 typedef boost::date_time::dynamic_local_time_adjustor<ptime, us_dst> lta;
160// lta adjustor(hours(-7));
161 check(testname: "dst start", testcond: lta::local_dst_start_day(year: 2002) == dst_start);
162 check(testname: "dst end", testcond: lta::local_dst_end_day(year: 2002) == dst_end_day);
163 check(testname: "dst boundary", testcond: lta::is_dst_boundary_day(d: dst_start));
164 check(testname: "dst boundary", testcond: lta::is_dst_boundary_day(d: dst_end_day));
165// check("check non-dst offset", adjustor.utc_offset(false)==hours(-7));
166// check("check dst offset", adjustor.utc_offset(true)==hours(-6));
167
168
169 check(testname: "dst start", testcond: lta::local_dst_start_day(year: 2007) == date(2007,Mar,11));
170 check(testname: "dst end", testcond: lta::local_dst_end_day(year: 2007) == date(2007,Nov,4));
171
172 return printTestStats();
173
174}
175
176

source code of boost/libs/date_time/test/posix_time/testlocal_adjustor.cpp