OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimDate.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: LGPL
4 //
5 // See LICENSE.txt file in the top level directory for more details.
6 //
7 // Author: Garrett Potts
8 //
9 //----------------------------------------------------------------------------
10 // $Id: ossimDate.cpp 23002 2014-11-24 17:11:17Z dburken $
11 
12 #include <ossim/base/ossimDate.h>
13 #include <cctype> /* for isdigit */
14 #include <iomanip>
15 #include <sstream>
16 #include <iostream>
17 
18 std::mutex ossimLocalTm::m_mutex;
19 
21 {
22  return src.print(out);
23 }
24 
26 {
27  return t.print(os);
28 }
29 
30 int operator== (ossimLocalTm const & t1, ossimLocalTm const & t2)
31 {
32  return int(t1.compare(t2) == 0);
33 }
34 
35 int operator!= (ossimLocalTm const & t1, ossimLocalTm const & t2)
36 {
37  return int(t1.compare(t2) != 0);
38 }
39 
40 int operator< (ossimLocalTm const & t1, ossimLocalTm const & t2)
41 {
42  return int(t1.compare(t2) < 0);
43 }
44 
45 int operator<= (ossimLocalTm const & t1, ossimLocalTm const & t2)
46 {
47  return int(t1.compare(t2) <= 0);
48 }
49 
50 int operator> (ossimLocalTm const & t1, ossimLocalTm const & t2)
51 {
52  return int(t1.compare(t2) > 0);
53 }
54 
55 int operator>= (ossimLocalTm const & t1, ossimLocalTm const & t2)
56 {
57  return int(t1.compare(t2) >= 0);
58 }
59 
60 char ossimLocalTm::timech = ':';
61 char ossimLocalTm::datech = '/';
62 
65 
66 
68  :theFractionalSecond(0.0)
69 {
70  if (t == 0)
71  t = time(0);
72  *(tm *)this = *localtime(&t);
73 
75 
76 }
77 
79  :theFractionalSecond(0.0)
80 {
81  *((tm *)this) = t;
83 }
85  :theFractionalSecond(t.theFractionalSecond)
86 {
87  *((tm *)this) = t;
89 }
90 
92 {
93  *((tm *)this) = t;
94  return *this;
95 }
96 
98 {
99  *((tm *)this) = t;
101  return *this;
102 }
103 
104 int ossimLocalTm::compare (ossimLocalTm const & t) const
105 {
106  return compare ((time_t)t);
107 }
108 
109 int ossimLocalTm::compare (time_t const tt) const
110 {
111  time_t tx = (time_t)*this;
112  return (tx == tt) ? 0 : (tx > tt) ? 1 : -1;
113 }
114 
115 ossimLocalTm::operator time_t (void) const
116 {
117  return mktime ((tm *)this);
118 }
119 
120 int ossimLocalTm::isValid (void) const
121 {
122  static int maxd[] =
123  {
124  31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
125  };
126 
127  return ((tm_year > 0) &&
128  (tm_mon >= 0) && (tm_mon < 12) &&
129  (tm_mday > 0) && (tm_mday <= maxd[tm_mon]) &&
130  (tm_wday < 7) && (tm_yday < 367) &&
131  (tm_sec < 60) && (tm_min < 60) && (tm_hour < 24));
132 }
134 {
135  time_t t = time(0);
136  *this = *localtime(&t);
137 }
138 
139 void ossimLocalTm::dSfx (std::ostream & os, int fmt) const
140 {
141  if (fmt & ossimLocalTmFormatSepChar)
142  os << datech;
143  if (fmt & ossimLocalTmFormatSepSpace)
144  os << ' ';
145 }
146 
147 void ossimLocalTm::pYear (std::ostream & os, int fmt) const
148 {
149  if (fmt & ossimLocalTmFormatYear)
150  {
151  int year = tm_year;
152  int dig;
153  if (fmt & ossimLocalTmFormatYearShort)
154  {
155  dig = 2;
156  year %= 100;
157  }
158  else
159  {
160  dig = 4;
161  if (year < 200)
162  year += 1900;
163  }
164  os << std::setw((fmt & ossimLocalTmFormatPadYear) ? dig : 0);
165  os << std::setfill((fmt & ossimLocalTmFormatZeroYear) ? '0' : ' ');
166  os << year;
167  if ((fmt & ossimLocalTmFormatYearFirst))
168  {
170  dSfx (os, fmt);
171  }
172  }
173 }
174 
175 void ossimLocalTm::pMonth (std::ostream & os, int fmt) const
176 {
177 
178  static const char * _months[] =
179  {
180  "January", "February", "March", "April",
181  "May", "June", "July", "August", "September",
182  "October", "November", "December"
183  };
184 
185  if (fmt & ossimLocalTmFormatMonth)
186  {
187  int mon = (tm_mon % 12);
188  if (fmt & ossimLocalTmFormatMonText)
189  {
190  char const * tmon = _months[mon];
191  if (!(fmt & ossimLocalTmFormatPadMon))
192  os << tmon;
193  else
194  for (int x = 0; x < 3; ++x)
195  os << tmon[x];
196  }
197  else
198  {
199  ++mon;
200  os << std::setw((fmt & ossimLocalTmFormatPadMon) ? 2 : 0);
201  os << std::setfill((fmt & ossimLocalTmFormatZeroMon) ? '0' : ' ');
202  os << mon;
203  }
204  if (((fmt & ossimLocalTmFormatYear) && !(fmt & ossimLocalTmFormatYearFirst)) ||
206  {
208  dSfx (os, fmt);
209  }
210  }
211 }
212 
213 
214 void ossimLocalTm::pDate (std::ostream & os, int fmt) const
215 {
216  if (fmt & ossimLocalTmFormatDay)
217  {
218  int day = tm_mday;
219  os << std::setw((fmt & ossimLocalTmFormatPadDay) ? 2 : 0);
220  os << std::setfill((fmt & ossimLocalTmFormatZeroDay) ? '0' : ' ');
221  os << day;
223  {
225  dSfx (os, fmt);
226  }
227  }
228 }
229 
231 {
232  m_mutex.lock();
233  // struct tm gmt = *this;
234 #if !defined(_MSC_VER)
235  tzset();
236 #else
237  _tzset();
238 #endif
239 
240 #if ( defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) )
241  //gmt.tm_sec -= tm_gmtoff; // Seconds east of UTC
242  m_timezoneOffset = tm_gmtoff;
243 #elif (defined(WIN32))
244  long timezoneOffset=0;
245  _get_timezone(&timezoneOffset);
246  //m_timezoneOffset = timezone; // Seconds west of UTC
247  if ( tm_isdst )
248  {
249  timezoneOffset -= 3600; // Subtract an hour.
250  }
251  m_timezoneOffset = -timezoneOffset;
252 #else
253  m_timezoneOffset = timezone; // Seconds west of UTC
254  if ( tm_isdst )
255  {
256  m_timezoneOffset -= 3600; // Subtract an hour.
257  }
259 #endif
260  m_mutex.unlock();
261 
263 }
264 
266  int df,
267  int tf) const
268 {
269  std::ostringstream pTmp;
270  printDate (pTmp, df);
271  pTmp << ' ';
272  printTime (pTmp, tf);
273 
274  return os << pTmp.str();
275 }
276 
277 
278 
280 {
281  std::ostringstream pTmp;
282 
283  static const char * _days[] =
284  {
285  "Sunday", "Monday", "Tuesday", "Wednesday",
286  "Thursday", "Friday", "Saturday"
287  };
288 
289  if (fmt & ossimLocalTmFormatDayOfWeek)
290  {
291  int day = tm_wday % 7;
292  char const * p = _days[day];
293  if (fmt & ossimLocalTmFormatPadDay)
294  for (int x = 0; x < 3; ++x)
295  pTmp << p[x];
296  else
297  {
298  pTmp << p;
299  if (fmt & ossimLocalTmFormatDMY)
300  pTmp << ',';
301  }
303  pTmp << ' ';
304  }
305  if (fmt & ossimLocalTmFormatYearFirst)
306  pYear (pTmp, fmt);
307  if (fmt & ossimLocalTmFormatMonFirst)
308  pMonth (pTmp, fmt);
309  pDate (pTmp, fmt);
310  if (!(fmt & ossimLocalTmFormatMonFirst))
311  pMonth (pTmp, fmt);
312  if (!(fmt & ossimLocalTmFormatYearFirst))
313  pYear (pTmp, fmt);
314 
315  return os << pTmp.str();
316 }
317 
319 {
320  // Capture the original flags.
321  std::ios_base::fmtflags f = os.flags();
322 
323  os << setiosflags(ios::fixed) << setprecision(8) << setiosflags(ios::left);
324 
325  os << "fr_sec: " << setw(12) << theFractionalSecond
326  << "fractional second\n"
327  << "tm_sec: " << setw(12) << tm_sec
328  << "seconds [0-60] (1 leap second)\n"
329  << "tm_min: " << setw(12) << tm_min << "minutes [0-59]\n"
330  << "tm_hour: " << setw(12) << tm_hour << "hours [0-23]\n"
331  << "tm_mday: " << setw(12) << tm_mday << "day [1-31]\n"
332  << "tm_mon: " << setw(12) << tm_mon << "month [0-11]\n"
333  << "tm_year: " << setw(12) << tm_year << "year - 1900\n"
334  << "tm_wday: " << setw(12) << tm_wday << "day of week [0-6]\n"
335  << "tm_yday: " << setw(12) << tm_yday << "days in year[0-365]\n"
336  << "tm_isdst: " << setw(12) << tm_isdst << "DST.[-1/0/1]\n"
337  << std::endl;
338 
339  // Reset flags.
340  os.setf(f);
341 
342  return os;
343 }
344 
345 void ossimLocalTm::tSfx (std::ostream & os, int fmt, char ch) const
346 {
347  if (fmt & ossimTimeFormatSepAbbrev)
348  os << ch;
349  if (fmt & ossimTimeFormatSepChar)
350  os << timech;
351  if (fmt & ossimTimeFormatSepSpace)
352  os << ' ';
353 }
354 
355 void ossimLocalTm::pHour (std::ostream & os, int fmt) const
356 {
357  if (fmt & ossimTimeFormatHour)
358  {
359  int hour = tm_hour;
360  if (!(fmt & ossimTimeFormat24hour))
361  {
362  if (hour > 12)
363  hour -= 12;
364  else if (!hour && (fmt & ossimTimeFormatAmPm))
365  hour += 12;
366  }
367  os << std::setw((fmt & ossimTimeFormatPadHour) ? 2 : 0);
368  os << std::setfill((fmt & ossimTimeFormatZeroHour) ? '0' : ' ');
369  os << hour;
370  if (!(fmt & ossimTimeFormatMins))
372  tSfx (os, fmt, 'h');
373  }
374 }
375 
376 void ossimLocalTm::pMins (std::ostream & os, int fmt) const
377 {
378  if (fmt & ossimTimeFormatMins)
379  {
380  int min = tm_min;
381  int dig = 2;
382  if (!(fmt & ossimTimeFormatHour))
383  {
384  min += (tm_hour * 60);
385  dig += 2;
386  }
387  os << std::setw((fmt & ossimTimeFormatPadMins) ? dig : 0);
388  os << std::setfill((fmt & ossimTimeFormatZeroMins) ? '0' : ' ');
389  os << min;
390  if (!(fmt & ossimTimeFormatSecs))
392  tSfx (os, fmt, 'm');
393  }
394 }
395 
396 void ossimLocalTm::pSecs (std::ostream & os, int fmt) const
397 {
398  if (fmt & ossimTimeFormatSecs)
399  {
400  int sec = tm_sec;
401  int dig = 2;
403  {
404  sec += ((tm_hour * 60) + tm_min) + 60;
405  dig += 3;
406  }
407  os << std::setw((fmt & ossimTimeFormatPadSecs) ? dig : 0);
408  os << std::setfill((fmt & ossimTimeFormatZeroSecs) ? '0' : ' ');
409  os << sec;
410  if (fmt & ossimTimeFormatAmPm)
411  fmt &= ~ossimTimeFormatSepChar;
412  else
414  tSfx (os, fmt, 's');
415  }
416 }
417 
419 {
420  std::ostringstream pTmp;
421  pHour (pTmp, fmt);
422  pMins (pTmp, fmt);
423  pSecs (pTmp, fmt);
424  if (fmt & ossimTimeFormatAmPm)
425  {
426  pTmp << (tm_hour > 11 ? "pm" : "am");
427  }
428 
429  return os << pTmp.str();
430 }
431 
432 
434 {
435  int result = tm_year;
436 // if (result < 200)
437  {
438  result += 1900;
439  }
440  return result;
441 }
442 
444 {
445  return (getYear()%100);
446 }
447 
449 {
450  return ((tm_mon % 12)+1);
451 }
452 
454 {
455  return tm_mday;
456 }
457 
459 {
460  int J = getMonth();
461  int K = getDay();
462  int I = getYear();
463 
464  return (K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12)
465  /12-3*((I+4900+(J-14)/12)/100)/4+
466  (getHour()/24.0)+
467  (getMin()/1440.0)+
468  ((getSec()+theFractionalSecond)/86400.0));
469 }
470 
472 {
473  return getJulian() - 2400000.5;
474 }
475 
477 {
478  tm_mday = day;
479 
480  return *this;
481 }
482 
484 {
485  tm_mon = month - 1;
486 
487  return *this;
488 }
489 
491 {
492  if(year < 2099)
493  {
494  tm_year = year - 1900;
495  }
496  else
497  {
498  tm_year = year;
499  }
500 
501  return *this;
502 }
503 
505 {
506  double fractional = jd - (long)jd;
507  long l;
508  long n;
509  long i;
510  long j;
511  long k;
512 
513 
514  l= (long)(jd+68569);
515  n= 4*l/146097;
516  l= l-(146097*n+3)/4;
517  i= 4000*(l+1)/1461001;
518  l= l-1461*i/4+31l;
519  j= 80*l/2447;
520  k= l-2447*j/80;
521  l= j/11;
522  j= j+2-12*l;
523  i= 100*(n-49)+i+l;
524  setDay(k);
525  setMonth(j);
526  setYear(i);
527 
528  setFractionalDay(fractional);
529 
530  return *this;
531 }
532 
534 {
535  setDateFromJulian(mjd + 2400000.5);
536 
537  return *this;
538 }
539 
540 void ossimLocalTm::setFractionalDay(double fractionalDay)
541 {
542  int h, m, s;
543  double fractionalSecond;
544  extractHmsFromFractionalDay(fractionalDay, h, m, s, fractionalSecond);
545 
546  setHour(h);
547  setMin(m);
548  setSec(s);
549  setFractionalSecond(fractionalSecond);
550 }
551 
553  int &h,
554  int &m,
555  int &s,
556  double& fractionalSecond)
557 {
558  fractionalDay *=24;
559  h = (int)fractionalDay;
560  fractionalDay = fractionalDay-h;
561  fractionalDay*=60;
562  m = (int)fractionalDay;
563  fractionalDay = fractionalDay-m;
564  fractionalDay*=60;
565  s = (int)fractionalDay;
566  fractionalDay = fractionalDay-s;
567  fractionalSecond = fractionalDay;
568 }
569 
571 {
572  return tm_hour;
573 }
574 
576 {
577  return tm_min;
578 }
579 
581 {
582  return tm_sec;
583 }
584 
586 {
587  return theFractionalSecond;
588 }
589 
591 {
592  tm_hour = h;
593 
594  return *this;
595 }
596 
598 {
599  tm_min = m;
600 
601  return *this;
602 }
603 
605 {
606  tm_sec = s;
607 
608  return *this;
609 }
610 
612 {
613  tm_sec = (int)s;
614  return setFractionalSecond(s-tm_sec);
615 }
616 
618 {
619  theFractionalSecond = fractionalSecond;
620 
621  return *this;
622 }
623 
625 {
626  return getEpoc();
627 }
628 
630 {
631  std::tm temp = *this;
632 
633  return mktime(&temp);
634 }
635 
637 {
638  // use julian to help in this addition. Julian is in days
639  setDateFromJulian(getJulian() + (n/86400.0));
640 }
641 
643 {
644  setDateFromJulian(getJulian() + (n/1440.0));
645 }
646 
648 {
649  setDateFromJulian(getJulian() + (n/24.0));
650 }
651 
653 {
655 }
656 
658 {
659  return (getJulian()-d.getJulian())*86400.0;
660 }
661 
663 {
664  return (getJulian()-d.getJulian())*1440.0;
665 }
666 
668 {
669  return (getJulian()-d.getJulian())*24;
670 }
671 
673 {
674  return (getJulian()-d.getJulian());
675 }
676 
678 {
679  m_mutex.lock();
680  struct tm gmt = *this;
681 #if !defined(_MSC_VER)
682  tzset();
683 #else
684  _tzset();
685 #endif
686 
687 #if ( defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) )
688  gmt.tm_sec -= tm_gmtoff; // Seconds east of UTC
689 #elif (defined(WIN32))
690  long timezoneOffset=0;
691  _get_timezone(&timezoneOffset);
692  //m_timezoneOffset = timezone; // Seconds west of UTC
693  if ( tm_isdst )
694  {
695  timezoneOffset -= 3600; // Subtract an hour.
696  }
697  m_timezoneOffset = -timezoneOffset;
698 #else
699  m_timezoneOffset = timezone; // Seconds west of UTC
700  if ( tm_isdst )
701  {
702  m_timezoneOffset -= 3600; // Subtract an hour.
703  }
705 #endif
706 
707  time_t t = mktime(&gmt);
708  std::tm localTime = *localtime(&t);
709 
710 m_mutex.unlock();
711  ossimLocalTm result(localTime);
712 
713  return result;
714 }
715 
717 {
718  std::lock_guard<std::mutex> lock(m_mutex);
719  *this = *gmtime(&ticks);
720 }
721 
723 {
724  std::lock_guard<std::mutex> lock(m_mutex);
725  *this = *localtime(&ticks);
726 }
727 
728 
729 static bool readIntegerFromString(ossim_int32& result,
730  const std::string& input,
731  std::string::size_type& currentPos,
732  int digits)
733 {
734  ossimString number;
735  while((digits>0)&&
736  (currentPos < input.size()))
737  {
738  if(isdigit(input[currentPos]))
739  {
740  number += input[currentPos];
741  ++currentPos;
742  --digits;
743  }
744  else
745  {
746  return false;
747  }
748  }
749  result = number.toInt32();
750  return (digits <= 0);
751 }
752 
753 static bool readTimeZoneOffset(ossim_int32& result,
754  const std::string& input,
755  std::string::size_type& currentPos)
756 {
757  bool returnValue = false;
758  result = 0;
759  if(input[currentPos] == '+'||
760  input[currentPos] == '-')
761  {
762  returnValue = true;
763  ossim_int32 signMult = ((input[0] == '+')?1:-1);
764  ossim_int32 zoneMin = 0;
765  ossim_int32 zoneHour = 0;
766  ++currentPos;
767  if(readIntegerFromString(zoneHour,
768  input,
769  currentPos,
770  2))
771  {
772  if(!isdigit(input[currentPos]))
773  {
774  ++currentPos; // skip :
775  }
776  if(readIntegerFromString(zoneMin,
777  input,
778  currentPos,
779  2))
780  {
781  result = signMult*(zoneMin*60 + zoneHour*3600);
782  }
783  }
784  }
785 
786  return returnValue;
787 }
788 
789 bool ossimLocalTm::setIso8601(const std::string& timeString, bool shiftToGmtOffsetZero)
790 {
791  ossimDate now;
792  std::string::size_type pos = 0;
793  ossim_int32 year = 0;
794  ossim_int32 month = 0;
795  ossim_int32 day = 0;
796  ossim_int32 timeZoneOffset = 0;
797 
798  if(timeString[0] != 'T') // make sure it's not time only
799  {
800  // look for year
801  //
802  if(readIntegerFromString(year,
803  timeString,
804  pos,
805  4))
806  {
807  // retrieved the year portion
808  // now check for separator not digit
809  //
810 
811  // we at least have a year
812  // now check for others
813  setYear(year);
814  if(!isdigit(timeString[pos]))
815  {
816  // skip separator
817  ++pos;
818  }
819  if(readIntegerFromString(month,
820  timeString,
821  pos,
822  2))
823 
824  {
825  setMonth(month);
826  if(!isdigit(timeString[pos]))
827  {
828  // skip separator
829  ++pos;
830  }
831  if(readIntegerFromString(day,
832  timeString,
833  pos,
834  2))
835  {
836  setDay(day);
837  }
838  }
839  }
840  else
841  {
842  return false;
843  }
844  }
845  else // set year month day to current
846  {
847  setYear(now.getYear());
848  setMonth(now.getMonth());
849  setDay(now.getDay());
850  }
851  // check to see if we need to read time portion
852  if(timeString[pos] == 'T')
853  {
854  ++pos; // skip T character
855  ossim_int32 hours=0, minutes=0;
856 
857  if(readIntegerFromString(hours,
858  timeString,
859  pos,
860  2))
861  {
862  setHour(hours);
863 
864  // now check for separator
865  if(!std::isdigit(timeString[pos]))
866  {
867  ++pos; // skip separator if present
868  }
869  if(readIntegerFromString(minutes,
870  timeString,
871  pos,
872  2))
873  {
874  setMin(minutes);
875  // now check for time zone if only a hour minute time
876  //
877  if(timeString[pos] == 'Z')
878  {
879  std::time_t t = mktime(this);
880  t += m_timezoneOffset*3600;
881  setTimeGivenEpoc(t);
882  }
883  else if(!readTimeZoneOffset(timeZoneOffset,
884  timeString,
885  pos))
886  {
887  double fractionalSeconds = 0.0;
888  if(!std::isdigit(timeString[pos]))
889  {
890  ++pos;
891  }
892  std::string::size_type endPos = timeString.find_first_not_of("0123456789.", pos);
893  if(endPos == std::string::npos)
894  {
895  fractionalSeconds = ossimString(timeString.begin()+pos,
896  timeString.end()).toDouble();
897  }
898  else
899  {
900  fractionalSeconds = ossimString(timeString.begin()+pos,
901  timeString.begin()+endPos).toDouble();
902  }
903  setFloatSec(fractionalSeconds);
904  pos = endPos;
905  if(pos == std::string::npos)
906  {
907  // we will not be too strict so if at the end then just return we got enough
908  return true;
909  }
910  if(timeString[pos] == 'Z')
911  {
912  std::time_t t = mktime(this);
913  t += m_timezoneOffset*3600;
914  setTimeGivenEpoc(t);
915  //std::cout << "OFFSET == " << m_timezoneOffset << std::endl;
916  }
917  else
918  {
919  readTimeZoneOffset(timeZoneOffset,
920  timeString,
921  pos);
922  }
923  }
924  }
925  }
926  else
927  {
928  // need at least hours
929  return false;
930  }
931  }
932  else if(std::isdigit(timeString[pos]))
933  {
934  ossim_int32 hours=0, minutes=0;
935 
936  if(readIntegerFromString(hours,
937  timeString,
938  pos,
939  2))
940  {
941  setHour(hours);
942 
943  // now check for separator
944  if(!std::isdigit(timeString[pos]))
945  {
946  ++pos; // skip separator if present
947  }
948  if(readIntegerFromString(minutes,
949  timeString,
950  pos,
951  2))
952  {
953  setMin(minutes);
954 
955  if(!readTimeZoneOffset(timeZoneOffset,
956  timeString,
957  pos))
958  {
959  double fractionalSeconds = 0.0;
960  if(!std::isdigit(timeString[pos]))
961  {
962  ++pos;
963  }
964  std::string::size_type endPos = timeString.find_first_not_of("0123456789.", pos);
965  if(endPos == std::string::npos)
966  {
967  fractionalSeconds = ossimString(timeString.begin()+pos,
968  timeString.end()).toDouble();
969  }
970  else
971  {
972  fractionalSeconds = ossimString(timeString.begin()+pos,
973  timeString.begin()+endPos).toDouble();
974  }
975  setFloatSec(fractionalSeconds);
976  pos = endPos;
977  if(pos == std::string::npos)
978  {
979  // we will not be too strict so if at the end then just return we got enough
980  return true;
981  }
982  if(timeString[pos] == 'Z')
983  {
984  // For proper readouts we need to shift
985  // to current time zone of the system
986  //
987  //std::cout << "OFFSET == " << m_timezoneOffset << std::endl;
988 
989  std::time_t t = mktime(this);
990  t += m_timezoneOffset*3600;
991  setTimeGivenEpoc(t);
992  }
993  else
994  {
995  readTimeZoneOffset(timeZoneOffset,
996  timeString,
997  pos);
998  }
999  }
1000  }
1001  }
1002  }
1003  else
1004  {
1005  // need at least hours
1006  return false;
1007  }
1008 
1009  if(shiftToGmtOffsetZero && (timeZoneOffset!=0))
1010  {
1011  addSeconds(-timeZoneOffset);
1012  }
1013  return true;
1014 }
1015 
1017 {
1019 
1020  result->setTag("ossimDate");
1021  result->addAttribute("version", "1");
1022  result->addChildNode("month", ossimString::toString(getMonth()));
1023  result->addChildNode("day", ossimString::toString(getDay()));
1024  result->addChildNode("year", ossimString::toString(getYear()));
1025  result->addChildNode("hour", ossimString::toString(getHour()));
1026  result->addChildNode("minutes", ossimString::toString(getMin()));
1027  result->addChildNode("seconds", ossimString::toString(getSec()));
1028  result->addChildNode("fractionalSecond", ossimString::toString(getFractionalSecond()));
1029 
1030  return result.get();
1031 }
1032 
1034 {
1035  bool result = true;
1036  ossimRefPtr<ossimXmlNode> month = dateNode->findFirstNode("month");
1037  ossimRefPtr<ossimXmlNode> day = dateNode->findFirstNode("day");
1038  ossimRefPtr<ossimXmlNode> year = dateNode->findFirstNode("year");
1039  ossimRefPtr<ossimXmlNode> hour = dateNode->findFirstNode("hour");
1040  ossimRefPtr<ossimXmlNode> minutes = dateNode->findFirstNode("minutes");
1041  ossimRefPtr<ossimXmlNode> seconds = dateNode->findFirstNode("seconds");
1042  ossimRefPtr<ossimXmlNode> fractionalSecond = dateNode->findFirstNode("fractionalSecond");
1043  ossimRefPtr<ossimXmlNode> julian = dateNode->findFirstNode("julian");
1044  ossimRefPtr<ossimXmlNode> modifiedJulian = dateNode->findFirstNode("modifiedJulian");
1045 
1046  if(month.valid()&&
1047  day.valid()&&
1048  year.valid()&&
1049  hour.valid()&&
1050  minutes.valid()&&
1051  seconds.valid())
1052  {
1053  setMonth(month->getText().toInt32());
1054  setDay(day->getText().toInt32());
1055  setYear(year->getText().toInt32());
1056  setHour(hour->getText().toInt32());
1057  setMin(minutes->getText().toInt32());
1058  setSec(seconds->getText().toInt32());
1059  if(fractionalSecond.valid())
1060  {
1061  setFractionalSecond(fractionalSecond->getText().toDouble());
1062  }
1063  else
1064  {
1065  setFractionalSecond(0.0);
1066  }
1067  }
1068  else if(modifiedJulian.valid())
1069  {
1070  setDateFromModifiedJulian(modifiedJulian->getText().toDouble());
1071  }
1072  else if(julian.valid())
1073  {
1074  setDateFromJulian(julian->getText().toDouble());
1075  }
1076  else
1077  {
1078  result = false;
1079  }
1080 
1081  return result;
1082 }
1083 
1085  :ossimLocalTm(0), _fmt(datefmt)
1086 {}
1087 
1089  int dtfmt)
1090  : ossimLocalTm (t), _fmt(dtfmt)
1091 {}
1092 
1093 ossimDate::ossimDate (time_t t, int dtfmt)
1094  : ossimLocalTm (t), _fmt(dtfmt)
1095 {}
1096 
1098  int day,
1099  int year,
1100  int dtfmt)
1101  :ossimLocalTm (0), _fmt(dtfmt)
1102 {
1103  setMonth(month);
1104  setDay(day);
1105  setYear(year);
1106  setHour(0);
1107  setMin(0);
1108  setSec(0);
1109  setFractionalSecond(0.0);
1110 }
1111 
1112 int ossimDate::fmt(int f)
1113 {
1114  return _fmt = f;
1115 }
1116 
1117 int ossimDate::fmt(void) const
1118 {
1119  return _fmt;
1120 }
1121 
1123 {
1124  return printDate (os, _fmt);
1125 }
1126 
1128 {
1129  return src.print(out);
1130 }
1132  : ossimLocalTm(0), _fmt(tmfmt)
1133 {
1134 }
1136  int tmfmt)
1137  : ossimLocalTm (t), _fmt(tmfmt)
1138 {
1139 }
1140 
1141 ossimTime::ossimTime(time_t t, int tmfmt)
1142  : ossimLocalTm (t), _fmt(tmfmt)
1143 {
1144 }
1145 
1146 int ossimTime::fmt(int f)
1147 {
1148  return _fmt = f;
1149 }
1150 
1151 int ossimTime::fmt(void) const
1152 {
1153  return _fmt;
1154 }
1155 
1157 {
1158  return printTime(os, _fmt);
1159 }
ossimLocalTm & setDateFromModifiedJulian(double mjd)
Definition: ossimDate.cpp:533
ossim_uint32 x
int isValid(void) const
Definition: ossimDate.cpp:120
ossimLocalTm & setDay(int day)
Definition: ossimDate.cpp:476
void pDate(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:214
void setTag(const ossimString &tag)
int fmt(void) const
Definition: ossimDate.cpp:1151
std::basic_ostringstream< char > ostringstream
Class for char output memory streams.
Definition: ossimIosFwd.h:35
void addDays(ossim_float64 n)
Definition: ossimDate.cpp:652
ossim_float64 deltaInSeconds(const ossimLocalTm &d) const
Definition: ossimDate.cpp:657
std::ostream & print(std::ostream &os, int df=datefmt, int tf=timefmt) const
Definition: ossimDate.cpp:265
int operator==(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:30
bool valid() const
Definition: ossimRefPtr.h:75
static char datech
Definition: ossimDate.h:120
void pSecs(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:396
int getSec() const
Definition: ossimDate.cpp:580
static ossimString toString(bool aValue)
Numeric to string methods.
void addSeconds(ossim_float64 n)
Definition: ossimDate.cpp:636
void pHour(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:355
int getYear() const
Definition: ossimDate.cpp:433
int getMin() const
Definition: ossimDate.cpp:575
void addMinutes(ossim_float64 n)
Definition: ossimDate.cpp:642
std::ostream & printTime(std::ostream &os, int f=timefmt) const
Definition: ossimDate.cpp:418
const ossimRefPtr< ossimXmlNode > & findFirstNode(const ossimString &rel_xpath) const
int _fmt
Definition: ossimDate.h:258
void setTimezoneOffsetFromGmt()
Definition: ossimDate.cpp:230
void pMins(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:376
int operator!=(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:35
void pYear(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:147
ossim_int32 toInt32() const
ossimRefPtr< ossimXmlNode > saveXml() const
Definition: ossimDate.cpp:1016
double ossim_float64
std::ostream & dump(std::ostream &os) const
method to dump all the data members.
Definition: ossimDate.cpp:318
ossimLocalTm & setFloatSec(double s)
Definition: ossimDate.cpp:611
static int timefmt
Definition: ossimDate.h:122
const ossimString & getText() const
Definition: ossimXmlNode.h:92
ossim_float64 deltaInDays(const ossimLocalTm &d) const
Definition: ossimDate.cpp:672
int operator>(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:50
static std::mutex m_mutex
Definition: ossimDate.h:235
ossim_float64 deltaInMinutes(const ossimLocalTm &d) const
Definition: ossimDate.cpp:662
ossimLocalTm & setFractionalSecond(double fractS)
Definition: ossimDate.cpp:617
void tSfx(std::ostream &os, int fmt, char ch) const
Definition: ossimDate.cpp:345
ossimLocalTm convertToGmt() const
Definition: ossimDate.cpp:677
std::ostream & print(std::ostream &os) const
Definition: ossimDate.cpp:1122
void setTimeNoAdjustmentGivenEpoc(time_t ticks)
Will not adjust for timezone.
Definition: ossimDate.cpp:716
os2<< "> n<< " > nendobj n
int getShortYear() const
Definition: ossimDate.cpp:443
ossimLocalTm & setMonth(int month)
Definition: ossimDate.cpp:483
double toDouble() const
int compare(ossimLocalTm const &t) const
Definition: ossimDate.cpp:104
int fmt(void) const
Definition: ossimDate.cpp:1117
ossim_float64 delatInHours(const ossimLocalTm &d) const
Definition: ossimDate.cpp:667
ossimLocalTm & setYear(int year)
Definition: ossimDate.cpp:490
int m_timezoneOffset
Definition: ossimDate.h:237
ossimLocalTm & setHour(int h)
Definition: ossimDate.cpp:590
time_t getEpoc() const
Definition: ossimDate.cpp:629
bool loadXml(ossimRefPtr< ossimXmlNode > dateNode)
Definition: ossimDate.cpp:1033
ossimLocalTm & setSec(int s)
Definition: ossimDate.cpp:604
double getFractionalSecond() const
Definition: ossimDate.cpp:585
void addHours(ossim_float64 n)
Definition: ossimDate.cpp:647
void setFractionalDay(double fractionalDay)
Definition: ossimDate.cpp:540
int operator<=(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:45
ossimLocalTm & setDateFromJulian(double jd)
Definition: ossimDate.cpp:504
int getMonth() const
Definition: ossimDate.cpp:448
int getDay() const
Definition: ossimDate.cpp:453
bool setIso8601(const std::string &timeString, bool shiftToGmtOffsetZero=false)
Definition: ossimDate.cpp:789
std::ostream & print(std::ostream &os) const
Definition: ossimDate.cpp:1156
ossimLocalTm & setMin(int m)
Definition: ossimDate.cpp:597
ossimLocalTm(time_t t=0)
Definition: ossimDate.cpp:67
void setTimeGivenEpoc(time_t ticks)
Will adjust for timezone.
Definition: ossimDate.cpp:722
static char timech
Definition: ossimDate.h:119
int operator>=(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:55
std::ostream & printDate(std::ostream &os, int f=datefmt) const
Definition: ossimDate.cpp:279
double getJulian() const
Definition: ossimDate.cpp:458
void addAttribute(ossimRefPtr< ossimXmlAttribute > attribute)
static void extractHmsFromFractionalDay(double fractionalDay, int &h, int &m, int &s, double &fractionalSecond)
Definition: ossimDate.cpp:552
int _fmt
Definition: ossimDate.h:276
int getHour() const
Definition: ossimDate.cpp:570
void dSfx(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:139
ossimLocalTm & operator=(tm const &t)
Definition: ossimDate.cpp:91
std::ostream & operator<<(std::ostream &out, const ossimDate &src)
Definition: ossimDate.cpp:20
ossimDate(int datefmt=ossimLocalTm::datefmt)
Definition: ossimDate.cpp:1084
void addChildNode(ossimRefPtr< ossimXmlNode > node)
ossimTime(int tmfmt=ossimLocalTm::timefmt)
Definition: ossimDate.cpp:1131
double theFractionalSecond
Definition: ossimDate.h:236
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23
time_t getTicks() const
getTicks() will call getEpoc.
Definition: ossimDate.cpp:624
int operator<(ossimLocalTm const &t1, ossimLocalTm const &t2)
Definition: ossimDate.cpp:40
#define min(a, b)
Definition: auxiliary.h:75
int ossim_int32
double getModifiedJulian() const
Definition: ossimDate.cpp:471
static int datefmt
Definition: ossimDate.h:121
void pMonth(std::ostream &os, int fmt) const
Definition: ossimDate.cpp:175