/
usr
/
include
/
boost
/
date_time
/
/usr/include/boost/date_time
mkdir
upload
Name
Size
Mode
Actions
gregorian/
-
0755
rm
local_time/
-
0755
rm
posix_time/
-
0755
rm
adjust_functors.hpp
5467
0644
edit
dl
rm
compiler_config.hpp
5640
0644
edit
dl
rm
constrained_value.hpp
4224
0644
edit
dl
rm
c_local_time_adjustor.hpp
2631
0644
edit
dl
rm
c_time.hpp
4496
0644
edit
dl
rm
date.hpp
7357
0644
edit
dl
rm
date_clock_device.hpp
2299
0644
edit
dl
rm
date_defs.hpp
701
0644
edit
dl
rm
date_duration.hpp
4669
0644
edit
dl
rm
date_duration_types.hpp
9186
0644
edit
dl
rm
date_facet.hpp
29314
0644
edit
dl
rm
date_formatting.hpp
4208
0644
edit
dl
rm
date_formatting_limited.hpp
3461
0644
edit
dl
rm
date_formatting_locales.hpp
6748
0644
edit
dl
rm
date_format_simple.hpp
3128
0644
edit
dl
rm
date_generators.hpp
16508
0644
edit
dl
rm
date_generator_formatter.hpp
11715
0644
edit
dl
rm
date_generator_parser.hpp
13064
0644
edit
dl
rm
date_iterator.hpp
3305
0644
edit
dl
rm
date_names_put.hpp
10754
0644
edit
dl
rm
date_parsing.hpp
14146
0644
edit
dl
rm
dst_rules.hpp
15401
0644
edit
dl
rm
dst_transition_generators.hpp
2293
0644
edit
dl
rm
filetime_functions.hpp
3163
0644
edit
dl
rm
find_match.hpp
1355
0644
edit
dl
rm
format_date_parser.hpp
23909
0644
edit
dl
rm
gregorian_calendar.hpp
2714
0644
edit
dl
rm
gregorian_calendar.ipp
7947
0644
edit
dl
rm
int_adapter.hpp
14463
0644
edit
dl
rm
iso_format.hpp
5640
0644
edit
dl
rm
locale_config.hpp
1206
0644
edit
dl
rm
local_timezone_defs.hpp
7618
0644
edit
dl
rm
local_time_adjustor.hpp
8578
0644
edit
dl
rm
microsec_time_clock.hpp
6257
0644
edit
dl
rm
parse_format_base.hpp
961
0644
edit
dl
rm
period.hpp
11936
0644
edit
dl
rm
period_formatter.hpp
7237
0644
edit
dl
rm
period_parser.hpp
7932
0644
edit
dl
rm
special_defs.hpp
633
0644
edit
dl
rm
special_values_formatter.hpp
3657
0644
edit
dl
rm
special_values_parser.hpp
6161
0644
edit
dl
rm
strings_from_facet.hpp
4505
0644
edit
dl
rm
string_convert.hpp
1002
0644
edit
dl
rm
string_parse_tree.hpp
8405
0644
edit
dl
rm
time.hpp
6788
0644
edit
dl
rm
time_clock.hpp
2245
0644
edit
dl
rm
time_defs.hpp
942
0644
edit
dl
rm
time_duration.hpp
10569
0644
edit
dl
rm
time_facet.hpp
58988
0644
edit
dl
rm
time_formatting_streams.hpp
3752
0644
edit
dl
rm
time_iterator.hpp
1438
0644
edit
dl
rm
time_parsing.hpp
11846
0644
edit
dl
rm
time_resolution_traits.hpp
6760
0644
edit
dl
rm
time_system_counted.hpp
9051
0644
edit
dl
rm
time_system_split.hpp
8077
0644
edit
dl
rm
time_zone_base.hpp
3711
0644
edit
dl
rm
time_zone_names.hpp
3103
0644
edit
dl
rm
tz_db_base.hpp
15915
0644
edit
dl
rm
wrapping_int.hpp
5824
0644
edit
dl
rm
year_month_day.hpp
1375
0644
edit
dl
rm
Edit:
/usr/include/boost/date_time/local_time_adjustor.hpp
(8578B)
#ifndef DATE_TIME_LOCAL_TIME_ADJUSTOR_HPP__ #define DATE_TIME_LOCAL_TIME_ADJUSTOR_HPP__ /* Copyright (c) 2002,2003 CrystalClear Software, Inc. * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland * $Date$ */ /*! @file local_time_adjustor.hpp Time adjustment calculations for local times */ #include <stdexcept> #include <boost/throw_exception.hpp> #include <boost/date_time/compiler_config.hpp> #include <boost/date_time/date_generators.hpp> #include <boost/date_time/dst_rules.hpp> #include <boost/date_time/time_defs.hpp> // boost::date_time::dst_flags #include <boost/date_time/special_defs.hpp> // not_a_date_time namespace boost { namespace date_time { //! Provides a base offset adjustment from utc template<class time_duration_type, short hours, unsigned short minutes = 0> class utc_adjustment { public: static time_duration_type local_to_utc_base_offset() { time_duration_type td(hours,minutes,0); return td.invert_sign(); } static time_duration_type utc_to_local_base_offset() { return time_duration_type(hours,minutes,0); } }; //! Allow sliding utc adjustment with fixed dst rules template<class time_type, class dst_rules> class dynamic_local_time_adjustor : public dst_rules { public: typedef typename time_type::time_duration_type time_duration_type; typedef typename time_type::date_type date_type; dynamic_local_time_adjustor(time_duration_type utc_offset) : utc_offset_(utc_offset) {} //! Presumes local time time_duration_type utc_offset(bool is_dst) { if (is_dst) { return utc_offset_ + this->dst_offset(); } else { return utc_offset_; } } private: time_duration_type utc_offset_; }; //! Embed the rules for local time adjustments at compile time template<class time_type, class dst_rules, class utc_offset_rules> class static_local_time_adjustor: public dst_rules, public utc_offset_rules { public: typedef typename time_type::time_duration_type time_duration_type; typedef typename time_type::date_type date_type; //! Calculates the offset from a utc time to local based on dst and utc offset /*! @param t UTC time to calculate offset to local time * This adjustment depends on the following observations about the * workings of the DST boundary offset. Since UTC time labels are * monotonically increasing we can determine if a given local time * is in DST or not and therefore adjust the offset appropriately. * * The logic is as follows. Starting with UTC time use the offset to * create a label for an non-dst adjusted local time. Then call * dst_rules::local_is_dst with the non adjust local time. The * results of this function will either unabiguously decide that * the initial local time is in dst or return an illegal or * ambiguous result. An illegal result only occurs at the end * of dst (where labels are skipped) and indicates that dst has * ended. An ambiguous result means that we need to recheck by * making a dst adjustment and then rechecking. If the dst offset * is added to the utc time and the recheck proves non-ambiguous * then we are past the boundary. If it is still ambiguous then * we are ahead of the boundary and dst is still in effect. * * TODO -- check if all dst offsets are positive. If not then * the algorithm needs to check for this and reverse the * illegal/ambiguous logic. */ static time_duration_type utc_to_local_offset(const time_type& t) { //get initial local time guess by applying utc offset time_type initial = t + utc_offset_rules::utc_to_local_base_offset(); time_is_dst_result dst_flag = dst_rules::local_is_dst(initial.date(), initial.time_of_day()); switch(dst_flag) { case is_in_dst: return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset(); case is_not_in_dst: return utc_offset_rules::utc_to_local_base_offset(); case invalid_time_label:return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset(); case ambiguous: { time_type retry = initial + dst_rules::dst_offset(); dst_flag = dst_rules::local_is_dst(retry.date(), retry.time_of_day()); //if still ambibuous then the utc time still translates to a dst time if (dst_flag == ambiguous) { return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset(); } // we are past the dst boundary else { return utc_offset_rules::utc_to_local_base_offset(); } } }//case //TODO better exception type boost::throw_exception(std::out_of_range("Unreachable case")); BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return time_duration_type(not_a_date_time)); // should never reach } //! Get the offset to UTC given a local time static time_duration_type local_to_utc_offset(const time_type& t, date_time::dst_flags dst=date_time::calculate) { switch (dst) { case is_dst: return utc_offset_rules::local_to_utc_base_offset() - dst_rules::dst_offset(); case not_dst: return utc_offset_rules::local_to_utc_base_offset(); case calculate: time_is_dst_result res = dst_rules::local_is_dst(t.date(), t.time_of_day()); switch(res) { case is_in_dst: return utc_offset_rules::local_to_utc_base_offset() - dst_rules::dst_offset(); case is_not_in_dst: return utc_offset_rules::local_to_utc_base_offset(); case ambiguous: return utc_offset_rules::local_to_utc_base_offset(); case invalid_time_label: break; } } boost::throw_exception(std::out_of_range("Time label invalid")); BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return time_duration_type(not_a_date_time)); // should never reach } private: }; void dummy_to_prevent_msvc6_ice(); //why ask why? //! Template that simplifies the creation of local time calculator /*! Use this template to create the timezone to utc convertors as required. * * This class will also work for other regions that don't use dst and * have a utc offset which is an integral number of hours. * * <b>Template Parameters</b> * -time_type -- Time class to use * -utc_offset -- Number hours local time is adjust from utc * -use_dst -- true (default) if region uses dst, false otherwise * For example: * @code * //eastern timezone is utc-5 typedef date_time::local_adjustor<ptime, -5, us_dst> us_eastern; typedef date_time::local_adjustor<ptime, -6, us_dst> us_central; typedef date_time::local_adjustor<ptime, -7, us_dst> us_mountain; typedef date_time::local_adjustor<ptime, -8, us_dst> us_pacific; typedef date_time::local_adjustor<ptime, -7, no_dst> us_arizona; @endcode */ template<class time_type, short utc_offset, class dst_rule> class local_adjustor { public: typedef typename time_type::time_duration_type time_duration_type; typedef typename time_type::date_type date_type; typedef static_local_time_adjustor<time_type, dst_rule, utc_adjustment<time_duration_type, utc_offset> > dst_adjustor; //! Convert a utc time to local time static time_type utc_to_local(const time_type& t) { time_duration_type td = dst_adjustor::utc_to_local_offset(t); return t + td; } //! Convert a local time to utc static time_type local_to_utc(const time_type& t, date_time::dst_flags dst=date_time::calculate) { time_duration_type td = dst_adjustor::local_to_utc_offset(t, dst); return t + td; } }; } } //namespace date_time #endif
Save
cmd:
run