sj::time_of_day::time_of_day(boost::posix_time::time_duration time, boost::local_time::time_zone_ptr tz, boost::optional<bool> dst) : _time(time) , _tz(tz) , _dst(dst) { assert(time >= time_duration() && time < time_duration(hours(24))); static time_duration zerodur = time_duration(hours(0)); // following code is only to check if dst parameter is neccessary if (dst) { return; } if (tz->dst_offset() < zerodur) { std::stringstream ss; ss << "irrational timezone: " << tz->std_zone_name() << " DST offset: " << tz->dst_offset(); throw std::invalid_argument(ss.str()); } static date sampledate(2000, 1, 15); ptime sampletime(sampledate, time); time_duration tz_starttime = tz->dst_local_start_time(2000).time_of_day(); time_duration tz_endtime = tz->dst_local_end_time(2000).time_of_day(); ptime startsample(sampledate, tz_starttime); if (startsample > sampletime) { startsample -= days(1); } ptime endsample(sampledate, tz_endtime); if (endsample < sampletime) { endsample += days(1); } time_period tpd1(startsample, tz->dst_offset()); time_period tpd2(endsample - tz->dst_offset(), tz->dst_offset()); if (tpd1.contains(sampletime) || tpd2.contains(sampletime)) { std::stringstream ss; ss << "time_of_day(): dst setting is required for " << "tz: " << tz->std_zone_name() << " time: " << time; throw std::invalid_argument(ss.str()); } }
virtual int computePreference(const std::string& id, boost::local_time::time_zone_ptr tz) { /* * We implement here the following heuristic: * * If abbrev != name: * preference = 6 (this seems to select 'standard' cities in USA) * Otherwise, * take first city of the following 'preferred' list: * - Europe (5) * - Asia (4), * - Australia (3), * - America (2) * Otherwise, 1 */ if (tz->std_zone_abbrev() != tz->std_zone_name()) return 6; else { if (boost::starts_with(id, "Europe/")) return 5; else if (boost::starts_with(id, "Australia/")) return 4; else if (boost::starts_with(id, "Asia/")) return 3; else if (boost::starts_with(id, "America/")) return 2; else return 1; } }