| #ifndef _GREGORIAN__CONVERSION_HPP___ |
| #define _GREGORIAN__CONVERSION_HPP___ |
| |
| /* Copyright (c) 2004-2005 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: 2009-06-06 07:27:35 -0400 (Sat, 06 Jun 2009) $ |
| */ |
| |
| #include <string> |
| #include <stdexcept> |
| #include <boost/throw_exception.hpp> |
| #include <boost/date_time/c_time.hpp> |
| #include <boost/date_time/special_defs.hpp> |
| #include <boost/date_time/gregorian/gregorian_types.hpp> |
| |
| namespace boost { |
| |
| namespace gregorian { |
| |
| //! Converts a date to a tm struct. Throws out_of_range exception if date is a special value |
| inline |
| std::tm to_tm(const date& d) |
| { |
| if (d.is_special()) |
| { |
| std::string s = "tm unable to handle "; |
| switch (d.as_special()) |
| { |
| case date_time::not_a_date_time: |
| s += "not-a-date-time value"; break; |
| case date_time::neg_infin: |
| s += "-infinity date value"; break; |
| case date_time::pos_infin: |
| s += "+infinity date value"; break; |
| default: |
| s += "a special date value"; break; |
| } |
| boost::throw_exception(std::out_of_range(s)); |
| } |
| |
| std::tm datetm = {}; // zero initialization is needed for extension members, like tm_zone |
| boost::gregorian::date::ymd_type ymd = d.year_month_day(); |
| datetm.tm_year = ymd.year - 1900; |
| datetm.tm_mon = ymd.month - 1; |
| datetm.tm_mday = ymd.day; |
| datetm.tm_wday = d.day_of_week(); |
| datetm.tm_yday = d.day_of_year() - 1; |
| datetm.tm_isdst = -1; // negative because not enough info to set tm_isdst |
| return datetm; |
| } |
| |
| //! Converts a tm structure into a date dropping the any time values. |
| inline |
| date date_from_tm(const std::tm& datetm) |
| { |
| return date(static_cast<unsigned short>(datetm.tm_year+1900), |
| static_cast<unsigned short>(datetm.tm_mon+1), |
| static_cast<unsigned short>(datetm.tm_mday)); |
| } |
| |
| } } //namespace boost::gregorian |
| |
| #endif |