common/include/pion/PionDateTime.hpp

00001 // -----------------------------------------------------------------------
00002 // pion-common: a collection of common libraries used by the Pion Platform
00003 // -----------------------------------------------------------------------
00004 // Copyright (C) 2007-2008 Atomic Labs, Inc.  (http://www.atomiclabs.com)
00005 //
00006 // Distributed under the Boost Software License, Version 1.0.
00007 // See http://www.boost.org/LICENSE_1_0.txt
00008 //
00009 
00010 #ifndef __PION_PIONDATETIME_HEADER__
00011 #define __PION_PIONDATETIME_HEADER__
00012 
00013 #include <string>
00014 #include <istream>
00015 #include <ostream>
00016 #include <sstream>
00017 #include <boost/date_time/posix_time/posix_time.hpp>
00018 #include <boost/date_time/gregorian/greg_date.hpp>
00019 #include <pion/PionConfig.hpp>
00020 
00021 
00022 namespace pion {    // begin namespace pion
00023 
00024     
00026 typedef boost::posix_time::ptime    PionDateTime;
00027 
00028 
00029 
00030 
00034 class PionTimeFacet
00035 {
00036 public:
00037     
00038     // Function that converts a ptime into a time_t
00039     // Note: this is quick & dirty -- does not handle invalid dates,
00040     //      other calendars, pre-epoch dates, ...
00041     static inline boost::uint32_t to_time_t(const PionDateTime& t)
00042     {
00043         static const boost::posix_time::ptime start(boost::gregorian::date(1970,1,1));
00044         return (t-start).total_seconds();
00045     }
00046 
00047 
00049     PionTimeFacet(void) {}
00050     
00052     virtual ~PionTimeFacet(void) {}
00053 
00059     explicit PionTimeFacet(const std::string& format) {
00060         setFormat(format);
00061     }
00062 
00064     PionTimeFacet(const PionTimeFacet& f) {
00065         setFormat(f.getFormat());
00066     }
00067     
00069     PionTimeFacet& operator=(const PionTimeFacet& f) {
00070         setFormat(f.getFormat());
00071         return *this;
00072     }
00073 
00080     template <class charT, class traits>
00081     inline void read(std::basic_istream<charT,traits>& input, PionDateTime& t) {
00082         input.imbue(std::locale(input.getloc(), new boost::posix_time::time_input_facet(m_format.c_str())));
00083         input >> t;
00084     }
00085 
00092     template <class charT, class traits>
00093     inline void write(std::basic_ostream<charT,traits>& output, const PionDateTime& t) {
00094         output.imbue(std::locale(output.getloc(), new boost::posix_time::time_facet(m_format.c_str())));
00095         output << t;
00096     }
00097     
00104     inline void fromString(const std::string& str, PionDateTime& t) {
00105         m_input_stream.str(str);
00106         m_input_stream >> t;
00107     }
00108 
00115     inline void fromString(const char *str, PionDateTime& t) {
00116         m_input_stream.str(str);
00117         m_input_stream >> t;
00118     }
00119     
00126     inline PionDateTime fromString(const std::string& str) {
00127         PionDateTime t;
00128         m_input_stream.str(str);
00129         m_input_stream >> t;
00130         return t;
00131     }
00132     
00139     inline PionDateTime fromString(const char *str) {
00140         PionDateTime t;
00141         m_input_stream.str(str);
00142         m_input_stream >> t;
00143         return t;
00144     }
00145     
00152     inline void toString(std::string& str, const PionDateTime& t) {
00153         m_output_stream.str("");
00154         m_output_stream << t;
00155         str = m_output_stream.str();
00156     }
00157 
00164     inline std::string toString(const PionDateTime& t) {
00165         m_output_stream.str("");
00166         m_output_stream << t;
00167         return m_output_stream.str();
00168     }
00169 
00171     inline void setFormat(const std::string& format) {
00172         m_format = format;
00173         m_input_stream.imbue(std::locale(m_input_stream.getloc(), new boost::posix_time::time_input_facet(m_format.c_str())));
00174         m_output_stream.imbue(std::locale(m_output_stream.getloc(), new boost::posix_time::time_facet(m_format.c_str())));
00175     }
00176 
00178     inline const std::string& getFormat(void) const { return m_format; }
00179 
00180     
00181 private:
00182 
00184     std::string         m_format;
00185     
00187     std::stringstream   m_input_stream;
00188     
00190     std::stringstream   m_output_stream;
00191 };
00192 
00193 
00194 }   // end namespace pion
00195 
00196 #endif
00197 

Generated on Fri Apr 30 14:48:53 2010 for pion-net by  doxygen 1.4.7