Boost.Locale
date_time.hpp
1 //
2 // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 // https://www.boost.org/LICENSE_1_0.txt
6 
7 #ifndef BOOST_LOCALE_DATE_TIME_HPP_INCLUDED
8 #define BOOST_LOCALE_DATE_TIME_HPP_INCLUDED
9 
10 #include <boost/locale/date_time_facet.hpp>
11 #include <boost/locale/formatting.hpp>
12 #include <boost/locale/hold_ptr.hpp>
13 #include <boost/locale/time_zone.hpp>
14 #include <locale>
15 #include <stdexcept>
16 #include <vector>
17 
18 #ifdef BOOST_MSVC
19 # pragma warning(push)
20 # pragma warning(disable : 4275 4251 4231 4660)
21 #endif
22 
23 namespace boost {
24  namespace locale {
31 
32 
36  class BOOST_SYMBOL_VISIBLE date_time_error : public std::runtime_error {
37  public:
41  date_time_error(std::string const &e) : std::runtime_error(e) {}
42  };
43 
44 
54  {
56  int value;
57  date_time_period operator+() const { return *this; }
65 
70  };
71 
72  namespace period {
80  inline period_type era(){ return period_type(marks::era); }
84  inline period_type year(){ return period_type(marks::year); }
96  inline period_type day(){ return period_type(marks::day); }
151 
155  inline date_time_period era(int v) { return date_time_period(era(),v); }
159  inline date_time_period year(int v) { return date_time_period(year(),v); }
167  inline date_time_period month(int v) { return date_time_period(month(),v); }
171  inline date_time_period day(int v) { return date_time_period(day(),v); }
197  inline date_time_period hour(int v) { return date_time_period(hour(),v); }
201  inline date_time_period hour_12(int v) { return date_time_period(hour_12(),v); }
205  inline date_time_period am_pm(int v) { return date_time_period(am_pm(),v); }
209  inline date_time_period minute(int v) { return date_time_period(minute(),v); }
213  inline date_time_period second(int v) { return date_time_period(second(),v); }
226 
230  inline date_time_period january() { return date_time_period(month(),0); }
238  inline date_time_period march() { return date_time_period(month(),2); }
242  inline date_time_period april() { return date_time_period(month(),3); }
246  inline date_time_period may() { return date_time_period(month(),4); }
250  inline date_time_period june() { return date_time_period(month(),5); }
254  inline date_time_period july() { return date_time_period(month(),6); }
258  inline date_time_period august() { return date_time_period(month(),7); }
266  inline date_time_period october() { return date_time_period(month(),9); }
270  inline date_time_period november() { return date_time_period(month(),10); }
274  inline date_time_period december() { return date_time_period(month(),11); }
275 
307  inline date_time_period am() { return date_time_period(am_pm(),0); }
311  inline date_time_period pm() { return date_time_period(am_pm(),1); }
312 
317  {
318  return date_time_period(f);
319  }
324  {
325  return date_time_period(f,-1);
326  }
327 
331  template<typename T>
333  {
334  return date_time_period(f,v);
335  }
336 
340  template<typename T>
342  {
343  return date_time_period(f,v);
344  }
348  template<typename T>
350  {
351  return date_time_period(f.type,f.value*v);
352  }
353 
357  template<typename T>
359  {
360  return date_time_period(f.type,f.value*v);
361  }
362 
363 
364  } // period
365 
366 
374  public:
375 
380  {
381  }
386  {
387  basic_[0]=date_time_period(f);
388  }
393  {
394  basic_[0]=fl;
395  }
400  {
401  size_t n=size();
402  if(n < 4)
403  basic_[n]=f;
404  else
405  periods_.push_back(f);
406  }
410  size_t size() const
411  {
412  if(basic_[0].type == period::period_type())
413  return 0;
414  if(basic_[1].type == period::period_type())
415  return 1;
416  if(basic_[2].type == period::period_type())
417  return 2;
418  if(basic_[3].type == period::period_type())
419  return 3;
420  return 4+periods_.size();
421  }
425  date_time_period const &operator[](size_t n) const
426  {
427  if(n >= size())
428  throw std::out_of_range("Invalid index to date_time_period");
429  if(n < 4)
430  return basic_[n];
431  else
432  return periods_[n-4];
433  }
434  private:
435  date_time_period basic_[4];
436  std::vector<date_time_period> periods_;
437  };
438 
439 
444  {
446  for(unsigned i=0;i<b.size();i++)
447  s.add(b[i]);
448  return s;
449  }
450 
455  {
457  for(unsigned i=0;i<b.size();i++)
458  s.add(-b[i]);
459  return s;
460  }
461 
462 
470  class BOOST_LOCALE_DECL calendar {
471  public:
472 
479  calendar(std::ios_base &ios);
485  calendar(std::locale const &l,std::string const &zone);
491  calendar(std::locale const &l);
497  calendar(std::string const &zone);
503  calendar();
504  ~calendar();
505 
509  calendar(calendar const &other);
513  calendar const &operator=(calendar const &other);
514 
518  int minimum(period::period_type f) const;
522  int greatest_minimum(period::period_type f) const;
526  int maximum(period::period_type f) const;
530  int least_maximum(period::period_type f) const;
531 
534  int first_day_of_week() const;
535 
539  std::locale get_locale() const;
543  std::string get_time_zone() const;
544 
548  bool is_gregorian() const;
549 
553  bool operator==(calendar const &other) const;
557  bool operator!=(calendar const &other) const;
558 
559  private:
560  friend class date_time;
561  std::locale locale_;
562  std::string tz_;
564  };
565 
586 
587  class BOOST_LOCALE_DECL date_time {
588  public:
589 
595  date_time();
599  date_time(date_time const &other);
603  date_time(date_time const &other,date_time_period_set const &set);
607  date_time const &operator=(date_time const &other);
608  ~date_time();
609 
615  date_time(double time);
619  date_time(double time,calendar const &cal);
623  date_time(calendar const &cal);
624 
630  date_time(date_time_period_set const &set);
634  date_time(date_time_period_set const &set,calendar const &cal);
635 
636 
640  date_time const &operator=(date_time_period_set const &f);
641 
645  void set(period::period_type f,int v);
649  int get(period::period_type f) const;
650 
655  {
656  return get(f);
657  }
658 
663  {
664  return *this+date_time_period(f);
665  }
666 
671  {
672  return *this-date_time_period(f);
673  }
674 
679  {
680  return *this+=date_time_period(f);
681  }
686  {
687  return *this-=date_time_period(f);
688  }
689 
694  {
695  return *this << date_time_period(f);
696  }
697 
702  {
703  return *this>>date_time_period(f);
704  }
705 
710  {
711  return *this <<= date_time_period(f);
712  }
717  {
718  return *this >>= date_time_period(f);
719  }
720 
724  date_time operator+(date_time_period const &v) const;
728  date_time operator-(date_time_period const &v) const;
732  date_time const &operator+=(date_time_period const &v);
736  date_time const &operator-=(date_time_period const &v);
737 
741  date_time operator<<(date_time_period const &v) const;
745  date_time operator>>(date_time_period const &v) const ;
749  date_time const &operator<<=(date_time_period const &v);
753  date_time const &operator>>=(date_time_period const &v);
754 
758  date_time operator+(date_time_period_set const &v) const;
762  date_time operator-(date_time_period_set const &v) const;
766  date_time const &operator+=(date_time_period_set const &v);
770  date_time const &operator-=(date_time_period_set const &v);
771 
775  date_time operator<<(date_time_period_set const &v) const;
779  date_time operator>>(date_time_period_set const &v) const ;
783  date_time const &operator<<=(date_time_period_set const &v);
787  date_time const &operator>>=(date_time_period_set const &v);
788 
794  double time() const;
801  void time(double v);
802 
806  bool operator==(date_time const &other) const;
810  bool operator!=(date_time const &other) const;
814  bool operator<(date_time const &other) const;
818  bool operator>(date_time const &other) const;
822  bool operator<=(date_time const &other) const;
826  bool operator>=(date_time const &other) const;
827 
831  void swap(date_time &other);
832 
836  int difference(date_time const &other,period::period_type f) const;
837 
841  int minimum(period::period_type f) const;
846  int maximum(period::period_type f) const;
847 
851  bool is_in_daylight_saving_time() const;
852 
853  private:
855  };
856 
870  template<typename CharType>
871  std::basic_ostream<CharType> &operator<<(std::basic_ostream<CharType> &out,date_time const &t)
872  {
873  double time_point = t.time();
874  uint64_t display_flags = ios_info::get(out).display_flags();
875  if (
876  display_flags == flags::date
877  || display_flags == flags::time
878  || display_flags == flags::datetime
879  || display_flags == flags::strftime
880  )
881  {
882  out << time_point;
883  }
884  else {
885  ios_info::get(out).display_flags(flags::datetime);
886  out << time_point;
887  ios_info::get(out).display_flags(display_flags);
888  }
889  return out;
890  }
891 
897  template<typename CharType>
898  std::basic_istream<CharType> &operator>>(std::basic_istream<CharType> &in,date_time &t)
899  {
900  double v;
901  uint64_t display_flags = ios_info::get(in).display_flags();
902  if (
903  display_flags == flags::date
904  || display_flags == flags::time
905  || display_flags == flags::datetime
906  || display_flags == flags::strftime
907  )
908  {
909  in >> v;
910  }
911  else {
912  ios_info::get(in).display_flags(flags::datetime);
913  in >> v;
914  ios_info::get(in).display_flags(display_flags);
915  }
916  if(!in.fail())
917  t.time(v);
918  return in;
919  }
920 
921 #ifdef BOOST_MSVC
922 #pragma warning(push)
923 #pragma warning(disable:4512) //assignment operator could not be generated
924 #endif
925  class date_time_duration {
934  public:
935 
940  date_time_duration(date_time const &first,date_time const &second) :
941  s_(first),
942  e_(second)
943  {
944  }
945 
950  {
951  return start().difference(end(),f);
952  }
953 
958  {
959  return start().difference(end(),f);
960  }
961 
965  date_time const &start() const { return s_; }
969  date_time const &end() const { return e_; }
970  private:
971  date_time const &s_;
972  date_time const &e_;
973  };
974 #ifdef BOOST_MSVC
975 #pragma warning(pop)
976 #endif
977 
982  inline date_time_duration operator-(date_time const &later,date_time const &earlier)
983  {
984  return date_time_duration(earlier,later);
985  }
986 
987 
988  namespace period {
992  inline int era(date_time const &dt) { return dt.get(era()); }
996  inline int year(date_time const &dt) { return dt.get(year()); }
1000  inline int extended_year(date_time const &dt) { return dt.get(extended_year()); }
1004  inline int month(date_time const &dt) { return dt.get(month()); }
1008  inline int day(date_time const &dt) { return dt.get(day()); }
1012  inline int day_of_year(date_time const &dt) { return dt.get(day_of_year()); }
1021  inline int day_of_week(date_time const &dt) { return dt.get(day_of_week()); }
1026  inline int day_of_week_in_month(date_time const &dt) { return dt.get(day_of_week_in_month()); }
1030  inline int day_of_week_local(date_time const &dt) { return dt.get(day_of_week_local()); }
1034  inline int hour(date_time const &dt) { return dt.get(hour()); }
1038  inline int hour_12(date_time const &dt) { return dt.get(hour_12()); }
1042  inline int am_pm(date_time const &dt) { return dt.get(am_pm()); }
1046  inline int minute(date_time const &dt) { return dt.get(minute()); }
1050  inline int second(date_time const &dt) { return dt.get(second()); }
1054  inline int week_of_year(date_time const &dt) { return dt.get(week_of_year()); }
1058  inline int week_of_month(date_time const &dt) { return dt.get(week_of_month()); }
1062  inline int first_day_of_week(date_time const &dt) { return dt.get(first_day_of_week()); }
1063 
1067  inline int era(date_time_duration const &dt) { return dt.get(era()); }
1071  inline int year(date_time_duration const &dt) { return dt.get(year()); }
1075  inline int extended_year(date_time_duration const &dt) { return dt.get(extended_year()); }
1079  inline int month(date_time_duration const &dt) { return dt.get(month()); }
1083  inline int day(date_time_duration const &dt) { return dt.get(day()); }
1087  inline int day_of_year(date_time_duration const &dt) { return dt.get(day_of_year()); }
1091  inline int day_of_week(date_time_duration const &dt) { return dt.get(day_of_week()); }
1095  inline int day_of_week_in_month(date_time_duration const &dt) { return dt.get(day_of_week_in_month()); }
1099  inline int day_of_week_local(date_time_duration const &dt) { return dt.get(day_of_week_local()); }
1103  inline int hour(date_time_duration const &dt) { return dt.get(hour()); }
1107  inline int hour_12(date_time_duration const &dt) { return dt.get(hour_12()); }
1111  inline int am_pm(date_time_duration const &dt) { return dt.get(am_pm()); }
1115  inline int minute(date_time_duration const &dt) { return dt.get(minute()); }
1119  inline int second(date_time_duration const &dt) { return dt.get(second()); }
1123  inline int week_of_year(date_time_duration const &dt) { return dt.get(week_of_year()); }
1127  inline int week_of_month(date_time_duration const &dt) { return dt.get(week_of_month()); }
1131  inline int first_day_of_week(date_time_duration const &dt) { return dt.get(first_day_of_week()); }
1132 
1133 
1134  }
1135 
1137 
1138 
1139  } // locale
1140 } // boost
1141 
1142 #ifdef BOOST_MSVC
1143 #pragma warning(pop)
1144 #endif
1145 
1146 
1147 #endif
1148 
period_type am_pm()
Definition: date_time.hpp:130
int get(period::period_type f) const
period_type week_of_year()
Definition: date_time.hpp:142
period_type minute()
Definition: date_time.hpp:134
The week number within current month.
Definition: date_time_facet.hpp:52
period::period_type type
The type of period, i.e. era, year, day etc.
Definition: date_time.hpp:55
Definition: date_time_facet.hpp:43
period_type extended_year()
Definition: date_time.hpp:88
date_time_period saturday()
Definition: date_time.hpp:303
date_time_period_set()
Definition: date_time.hpp:379
int get(period::period_type f) const
Definition: date_time.hpp:949
Definition: date_time_facet.hpp:38
Year, it is calendar specific, for example 2011 in Gregorian calendar.
Definition: date_time_facet.hpp:33
this class that represents a set of periods,
Definition: date_time.hpp:373
date_time_period january()
Definition: date_time.hpp:230
int difference(date_time const &other, period::period_type f) const
date_time_period november()
Definition: date_time.hpp:270
date_time_error(std::string const &e)
Definition: date_time.hpp:41
This class represents a period: a pair of two date_time objects.
Definition: date_time.hpp:933
date_time const & operator>>=(period::period_type f)
Definition: date_time.hpp:716
date_time_period march()
Definition: date_time.hpp:238
period_type day_of_week()
Definition: date_time.hpp:109
The number of day in year, starting from 1, in Gregorian [1..366].
Definition: date_time_facet.hpp:37
date_time_period monday()
Definition: date_time.hpp:283
date_time_period february()
Definition: date_time.hpp:234
date_time_period april()
Definition: date_time.hpp:242
bool operator<(segment< IteratorL > const &l, segment< IteratorR > const &r)
Compare two segments.
Definition: segment.hpp:255
period_type first_day_of_week()
Definition: date_time.hpp:150
bool operator<=(segment< IteratorL > const &l, segment< IteratorR > const &r)
Compare two segments.
Definition: segment.hpp:261
this class provides an access to general calendar information.
Definition: date_time.hpp:470
date_time_period august()
Definition: date_time.hpp:258
int operator/(period::period_type f) const
Definition: date_time.hpp:957
date_time_period operator+() const
Definition: date_time.hpp:60
date_time_period am()
Definition: date_time.hpp:307
bool operator>=(segment< IteratorL > const &l, segment< IteratorR > const &r)
Compare two segments.
Definition: segment.hpp:273
date_time_period october()
Definition: date_time.hpp:266
date_time operator<<(period::period_type f) const
Definition: date_time.hpp:693
void add(date_time_period f)
Definition: date_time.hpp:399
date_time operator+(period::period_type f) const
Definition: date_time.hpp:662
bool operator==(BaseIterator const &l, boundary_point< BaseIterator > const &r)
Definition: boundary_point.hpp:141
date_time const & start() const
Definition: date_time.hpp:965
date_time_period december()
Definition: date_time.hpp:274
period_type era()
Definition: date_time.hpp:80
period_type hour()
Definition: date_time.hpp:122
a smart pointer similar to std::auto_ptr but it is non-copyable and the underlying object has the sam...
Definition: hold_ptr.hpp:19
void display_flags(uint64_t flags)
static ios_info & get(std::ios_base &ios)
date_time const & operator-=(period::period_type f)
Definition: date_time.hpp:685
The week number in the year.
Definition: date_time_facet.hpp:51
24 clock hour [0..23]
Definition: date_time_facet.hpp:46
Special invalid value, should not be used directly.
Definition: date_time_facet.hpp:31
The day of month, calendar specific, in Gregorian [1..31].
Definition: date_time_facet.hpp:36
period_type day_of_week_local()
Definition: date_time.hpp:118
minute [0..59]
Definition: date_time_facet.hpp:49
The month of year, calendar specific, in Gregorian [0..11].
Definition: date_time_facet.hpp:35
Local day of week, for example in France Monday is 1, in US Sunday is 1, [1..7].
Definition: date_time_facet.hpp:45
date_time_period operator-(period::period_type f)
Definition: date_time.hpp:323
date_time_period operator *(period::period_type f, T v)
Definition: date_time.hpp:332
period_type day_of_week_in_month()
Definition: date_time.hpp:114
date_time const & end() const
Definition: date_time.hpp:969
12 clock hour [0..11]
Definition: date_time_facet.hpp:47
date_time operator-(period::period_type f) const
Definition: date_time.hpp:670
This class represents a pair of period_type and the integer values that describes its amount....
Definition: date_time.hpp:53
date_time_period pm()
Definition: date_time.hpp:311
period_type day()
Definition: date_time.hpp:96
period_type year()
Definition: date_time.hpp:84
period_type week_of_month()
Definition: date_time.hpp:146
date_time_period const & operator[](size_t n) const
Definition: date_time.hpp:425
date_time_period_set operator-(date_time_period_set const &a, date_time_period_set const &b)
Definition: date_time.hpp:454
date_time_period wednesday()
Definition: date_time.hpp:291
date_time const & operator<<=(period::period_type f)
Definition: date_time.hpp:709
This error is thrown in case of invalid state that occurred.
Definition: date_time.hpp:36
date_time_period thursday()
Definition: date_time.hpp:295
am or pm marker [0..1]
Definition: date_time_facet.hpp:48
date_time_period_set(period::period_type f)
Definition: date_time.hpp:385
date_time_period_set(date_time_period const &fl)
Definition: date_time.hpp:392
date_time_period sunday()
Definition: date_time.hpp:279
std::basic_ostream< CharType > & operator<<(std::basic_ostream< CharType > &out, date_time const &t)
Definition: date_time.hpp:871
size_t size() const
Definition: date_time.hpp:410
date_time_period friday()
Definition: date_time.hpp:299
date_time_period tuesday()
Definition: date_time.hpp:287
int value
Definition: date_time.hpp:56
date_time_period operator+(period::period_type f)
Definition: date_time.hpp:316
date_time_duration(date_time const &first, date_time const &second)
Definition: date_time.hpp:940
period_type day_of_year()
Definition: date_time.hpp:100
Era i.e. AC, BC in Gregorian and Julian calendar, range [0,1].
Definition: date_time_facet.hpp:32
First day of week, constant, for example Sunday in US = 1, Monday in France = 2.
Definition: date_time_facet.hpp:53
date_time_period_set operator+(date_time_period_set const &a, date_time_period_set const &b)
Definition: date_time.hpp:443
period_type hour_12()
Definition: date_time.hpp:126
std::basic_istream< CharType > & operator>>(std::basic_istream< CharType > &in, date_time &t)
Definition: date_time.hpp:898
Extended year for Gregorian/Julian calendars, where 1 BC == 0, 2 BC == -1.
Definition: date_time_facet.hpp:34
period_type invalid()
Definition: date_time.hpp:76
date_time const & operator+=(period::period_type f)
Definition: date_time.hpp:678
date_time_period june()
Definition: date_time.hpp:250
date_time_period may()
Definition: date_time.hpp:246
this class represents a date time and allows to perform various operation according to the locale set...
Definition: date_time.hpp:587
date_time operator>>(period::period_type f) const
Definition: date_time.hpp:701
date_time_period operator-() const
Definition: date_time.hpp:64
std::ios_base & time(std::ios_base &ios)
Definition: formatting.hpp:328
date_time_period(period::period_type f=period::period_type(), int v=1)
Definition: date_time.hpp:69
bool operator>(segment< IteratorL > const &l, segment< IteratorR > const &r)
Compare two segments.
Definition: segment.hpp:267
period_type second()
Definition: date_time.hpp:138
second [0..59]
Definition: date_time_facet.hpp:50
period_type month()
Definition: date_time.hpp:92
date_time_period july()
Definition: date_time.hpp:254
bool operator!=(BaseIterator const &l, boundary_point< BaseIterator > const &r)
Definition: boundary_point.hpp:149
date_time_period september()
Definition: date_time.hpp:262
int operator/(period::period_type f) const
Definition: date_time.hpp:654
This class holds a type that represents certain period of time like year, hour, second and so on.
Definition: date_time_facet.hpp:69