/usr/include/boost/date_time
NameSizeModeActions
gregorian/-0755rm
local_time/-0755rm
posix_time/-0755rm
adjust_functors.hpp54670644editdlrm
compiler_config.hpp56400644editdlrm
constrained_value.hpp42240644editdlrm
c_local_time_adjustor.hpp26310644editdlrm
c_time.hpp44960644editdlrm
date.hpp73570644editdlrm
date_clock_device.hpp22990644editdlrm
date_defs.hpp7010644editdlrm
date_duration.hpp46690644editdlrm
date_duration_types.hpp91860644editdlrm
date_facet.hpp293140644editdlrm
date_formatting.hpp42080644editdlrm
date_formatting_limited.hpp34610644editdlrm
date_formatting_locales.hpp67480644editdlrm
date_format_simple.hpp31280644editdlrm
date_generators.hpp165080644editdlrm
date_generator_formatter.hpp117150644editdlrm
date_generator_parser.hpp130640644editdlrm
date_iterator.hpp33050644editdlrm
date_names_put.hpp107540644editdlrm
date_parsing.hpp141460644editdlrm
dst_rules.hpp154010644editdlrm
dst_transition_generators.hpp22930644editdlrm
filetime_functions.hpp31630644editdlrm
find_match.hpp13550644editdlrm
format_date_parser.hpp239090644editdlrm
gregorian_calendar.hpp27140644editdlrm
gregorian_calendar.ipp79470644editdlrm
int_adapter.hpp144630644editdlrm
iso_format.hpp56400644editdlrm
locale_config.hpp12060644editdlrm
local_timezone_defs.hpp76180644editdlrm
local_time_adjustor.hpp85780644editdlrm
microsec_time_clock.hpp62570644editdlrm
parse_format_base.hpp9610644editdlrm
period.hpp119360644editdlrm
period_formatter.hpp72370644editdlrm
period_parser.hpp79320644editdlrm
special_defs.hpp6330644editdlrm
special_values_formatter.hpp36570644editdlrm
special_values_parser.hpp61610644editdlrm
strings_from_facet.hpp45050644editdlrm
string_convert.hpp10020644editdlrm
string_parse_tree.hpp84050644editdlrm
time.hpp67880644editdlrm
time_clock.hpp22450644editdlrm
time_defs.hpp9420644editdlrm
time_duration.hpp105690644editdlrm
time_facet.hpp589880644editdlrm
time_formatting_streams.hpp37520644editdlrm
time_iterator.hpp14380644editdlrm
time_parsing.hpp118460644editdlrm
time_resolution_traits.hpp67600644editdlrm
time_system_counted.hpp90510644editdlrm
time_system_split.hpp80770644editdlrm
time_zone_base.hpp37110644editdlrm
time_zone_names.hpp31030644editdlrm
tz_db_base.hpp159150644editdlrm
wrapping_int.hpp58240644editdlrm
year_month_day.hpp13750644editdlrm
Edit: /usr/include/boost/date_time/dst_rules.hpp (15401B)
#ifndef DATE_TIME_DST_RULES_HPP__ #define DATE_TIME_DST_RULES_HPP__ /* Copyright (c) 2002,2003, 2007 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, Bart Garst * $Date$ */ /*! @file dst_rules.hpp Contains template class to provide static dst rule calculations */ #include "boost/date_time/date_generators.hpp" #include "boost/date_time/period.hpp" #include "boost/date_time/date_defs.hpp" #include namespace boost { namespace date_time { enum time_is_dst_result {is_not_in_dst, is_in_dst, ambiguous, invalid_time_label}; //! Dynamic class used to caluclate dst transition information template class dst_calculator { public: typedef time_duration_type_ time_duration_type; typedef date_type_ date_type; //! Check the local time offset when on dst start day /*! On this dst transition, the time label between * the transition boundary and the boudary + the offset * are invalid times. If before the boundary then still * not in dst. *@param time_of_day Time offset in the day for the local time *@param dst_start_offset_minutes Local day offset for start of dst *@param dst_length_minutes Number of minutes to adjust clock forward *@retval status of time label w.r.t. dst */ static time_is_dst_result process_local_dst_start_day(const time_duration_type& time_of_day, unsigned int dst_start_offset_minutes, long dst_length_minutes) { //std::cout << "here" << std::endl; if (time_of_day < time_duration_type(0,dst_start_offset_minutes,0)) { return is_not_in_dst; } long offset = dst_start_offset_minutes + dst_length_minutes; if (time_of_day >= time_duration_type(0,offset,0)) { return is_in_dst; } return invalid_time_label; } //! Check the local time offset when on the last day of dst /*! This is the calculation for the DST end day. On that day times * prior to the conversion time - dst_length (1 am in US) are still * in dst. Times between the above and the switch time are * ambiguous. Times after the start_offset are not in dst. *@param time_of_day Time offset in the day for the local time *@param dst_end_offset_minutes Local time of day for end of dst *@retval status of time label w.r.t. dst */ static time_is_dst_result process_local_dst_end_day(const time_duration_type& time_of_day, unsigned int dst_end_offset_minutes, long dst_length_minutes) { //in US this will be 60 so offset in day is 1,0,0 int offset = dst_end_offset_minutes-dst_length_minutes; if (time_of_day < time_duration_type(0,offset,0)) { return is_in_dst; } if (time_of_day >= time_duration_type(0,dst_end_offset_minutes,0)) { return is_not_in_dst; } return ambiguous; } //! Calculates if the given local time is dst or not /*! Determines if the time is really in DST or not. Also checks for * invalid and ambiguous. * @param current_day The day to check for dst * @param time_of_day Time offset within the day to check * @param dst_start_day Starting day of dst for the given locality * @param dst_start_offset Time offset within day for dst boundary * @param dst_end_day Ending day of dst for the given locality * @param dst_end_offset Time offset within day given in dst for dst boundary * @param dst_length_minutes length of dst adjusment * @retval The time is either ambiguous, invalid, in dst, or not in dst */ static time_is_dst_result local_is_dst(const date_type& current_day, const time_duration_type& time_of_day, const date_type& dst_start_day, const time_duration_type& dst_start_offset, const date_type& dst_end_day, const time_duration_type& dst_end_offset, const time_duration_type& dst_length) { unsigned int start_minutes = static_cast( dst_start_offset.hours() * 60 + dst_start_offset.minutes()); unsigned int end_minutes = static_cast( dst_end_offset.hours() * 60 + dst_end_offset.minutes()); long length_minutes = static_cast( dst_length.hours() * 60 + dst_length.minutes()); return local_is_dst(current_day, time_of_day, dst_start_day, start_minutes, dst_end_day, end_minutes, length_minutes); } //! Calculates if the given local time is dst or not /*! Determines if the time is really in DST or not. Also checks for * invalid and ambiguous. * @param current_day The day to check for dst * @param time_of_day Time offset within the day to check * @param dst_start_day Starting day of dst for the given locality * @param dst_start_offset_minutes Offset within day for dst * boundary (eg 120 for US which is 02:00:00) * @param dst_end_day Ending day of dst for the given locality * @param dst_end_offset_minutes Offset within day given in dst for dst * boundary (eg 120 for US which is 02:00:00) * @param dst_length_minutes Length of dst adjusment (eg: 60 for US) * @retval The time is either ambiguous, invalid, in dst, or not in dst */ static time_is_dst_result local_is_dst(const date_type& current_day, const time_duration_type& time_of_day, const date_type& dst_start_day, unsigned int dst_start_offset_minutes, const date_type& dst_end_day, unsigned int dst_end_offset_minutes, long dst_length_minutes) { //in northern hemisphere dst is in the middle of the year if (dst_start_day < dst_end_day) { if ((current_day > dst_start_day) && (current_day < dst_end_day)) { return is_in_dst; } if ((current_day < dst_start_day) || (current_day > dst_end_day)) { return is_not_in_dst; } } else {//southern hemisphere dst is at begining /end of year if ((current_day < dst_start_day) && (current_day > dst_end_day)) { return is_not_in_dst; } if ((current_day > dst_start_day) || (current_day < dst_end_day)) { return is_in_dst; } } if (current_day == dst_start_day) { return process_local_dst_start_day(time_of_day, dst_start_offset_minutes, dst_length_minutes); } if (current_day == dst_end_day) { return process_local_dst_end_day(time_of_day, dst_end_offset_minutes, dst_length_minutes); } //you should never reach this statement return invalid_time_label; } }; //! Compile-time configurable daylight savings time calculation engine /* This template provides the ability to configure a daylight savings * calculation at compile time covering all the cases. Unfortunately * because of the number of dimensions related to daylight savings * calculation the number of parameters is high. In addition, the * start and end transition rules are complex types that specify * an algorithm for calculation of the starting day and ending * day of daylight savings time including the month and day * specifications (eg: last sunday in October). * * @param date_type A type that represents dates, typically gregorian::date * @param time_duration_type Used for the offset in the day calculations * @param dst_traits A set of traits that define the rules of dst * calculation. The dst_trait must include the following: * start_rule_functor - Rule to calculate the starting date of a * dst transition (eg: last_kday_of_month). * start_day - static function that returns month of dst start for * start_rule_functor * start_month -static function that returns day or day of week for * dst start of dst * end_rule_functor - Rule to calculate the end of dst day. * end_day - static fucntion that returns end day for end_rule_functor * end_month - static function that returns end month for end_rule_functor * dst_start_offset_minutes - number of minutes from start of day to transition to dst -- 120 (or 2:00 am) is typical for the U.S. and E.U. * dst_start_offset_minutes - number of minutes from start of day to transition off of dst -- 180 (or 3:00 am) is typical for E.U. * dst_length_minutes - number of minutes that dst shifts clock */ template class dst_calc_engine { public: typedef typename date_type::year_type year_type; typedef typename date_type::calendar_type calendar_type; typedef dst_calculator dstcalc; //! Calculates if the given local time is dst or not /*! Determines if the time is really in DST or not. Also checks for * invalid and ambiguous. * @retval The time is either ambiguous, invalid, in dst, or not in dst */ static time_is_dst_result local_is_dst(const date_type& d, const time_duration_type& td) { year_type y = d.year(); date_type dst_start = local_dst_start_day(y); date_type dst_end = local_dst_end_day(y); return dstcalc::local_is_dst(d,td, dst_start, dst_traits::dst_start_offset_minutes(), dst_end, dst_traits::dst_end_offset_minutes(), dst_traits::dst_shift_length_minutes()); } static bool is_dst_boundary_day(date_type d) { year_type y = d.year(); return ((d == local_dst_start_day(y)) || (d == local_dst_end_day(y))); } //! The time of day for the dst transition (eg: typically 01:00:00 or 02:00:00) static time_duration_type dst_offset() { return time_duration_type(0,dst_traits::dst_shift_length_minutes(),0); } static date_type local_dst_start_day(year_type year) { return dst_traits::local_dst_start_day(year); } static date_type local_dst_end_day(year_type year) { return dst_traits::local_dst_end_day(year); } }; //! Depricated: Class to calculate dst boundaries for US time zones /* Use dst_calc_engine instead. * In 2007 US/Canada DST rules changed * (http://en.wikipedia.org/wiki/Energy_Policy_Act_of_2005#Change_to_daylight_saving_time). */ template //1 hour == 60 min in US class us_dst_rules { public: typedef time_duration_type_ time_duration_type; typedef date_type_ date_type; typedef typename date_type::year_type year_type; typedef typename date_type::calendar_type calendar_type; typedef date_time::last_kday_of_month lkday; typedef date_time::first_kday_of_month fkday; typedef date_time::nth_kday_of_month nkday; typedef dst_calculator dstcalc; //! Calculates if the given local time is dst or not /*! Determines if the time is really in DST or not. Also checks for * invalid and ambiguous. * @retval The time is either ambiguous, invalid, in dst, or not in dst */ static time_is_dst_result local_is_dst(const date_type& d, const time_duration_type& td) { year_type y = d.year(); date_type dst_start = local_dst_start_day(y); date_type dst_end = local_dst_end_day(y); return dstcalc::local_is_dst(d,td, dst_start,dst_start_offset_minutes, dst_end, dst_start_offset_minutes, dst_length_minutes); } static bool is_dst_boundary_day(date_type d) { year_type y = d.year(); return ((d == local_dst_start_day(y)) || (d == local_dst_end_day(y))); } static date_type local_dst_start_day(year_type year) { if (year >= year_type(2007)) { //second sunday in march nkday ssim(nkday::second, Sunday, date_time::Mar); return ssim.get_date(year); } else { //first sunday in april fkday fsia(Sunday, date_time::Apr); return fsia.get_date(year); } } static date_type local_dst_end_day(year_type year) { if (year >= year_type(2007)) { //first sunday in november fkday fsin(Sunday, date_time::Nov); return fsin.get_date(year); } else { //last sunday in october lkday lsio(Sunday, date_time::Oct); return lsio.get_date(year); } } static time_duration_type dst_offset() { return time_duration_type(0,dst_length_minutes,0); } private: }; //! Used for local time adjustments in places that don't use dst template class null_dst_rules { public: typedef time_duration_type_ time_duration_type; typedef date_type_ date_type; //! Calculates if the given local time is dst or not /*! @retval Always is_not_in_dst since this is for zones without dst */ static time_is_dst_result local_is_dst(const date_type&, const time_duration_type&) { return is_not_in_dst; } //! Calculates if the given utc time is in dst static time_is_dst_result utc_is_dst(const date_type&, const time_duration_type&) { return is_not_in_dst; } static bool is_dst_boundary_day(date_type /*d*/) { return false; } static time_duration_type dst_offset() { return time_duration_type(0,0,0); } }; } } //namespace date_time #endif