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 | |
13 | int |
14 | main() |
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 | |