Changeset 2808 in Sophya for trunk/SophyaLib/NTools/dates.cc
- Timestamp:
- Jun 14, 2005, 1:25:05 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/dates.cc
r2615 r2808 11 11 #include "dates.h" 12 12 13 //++ 14 // Class TimeZone 15 // Lib Outils++ 16 // include dates.h 17 // 18 // Classe de fuseau horaire. Permet les conversion 19 // GMT <-> temps local, en gérant les changements 20 // d'heure hiver-été. 21 // Deux fuseaux horaires sont prédéfinis, "France" 22 // et "Chili". 23 //-- 13 /*! 14 \class TimeZone 15 \ingroup NTools 16 Management of time zones - This class is used with class Date. 17 \warning Unless necessary, DO NOT USE this class. 18 \sa SOPHYA::TimeStamp 19 20 \verbatim 21 22 Classe de fuseau horaire. Permet les conversion 23 GMT <-> temps local, en gérant les changements 24 d'heure hiver-été. 25 Deux fuseaux horaires sont prédéfinis, "France" 26 et "Chili". 27 \endverbatim 28 */ 24 29 25 30 TimeZone* gTimeZone = NULL; 26 31 27 //++ 28 // Titre Constructeurs 29 //-- 30 31 //++ 32 33 /*! 34 Constructeur par défaut. Il lit la variable 35 d'environnement ACQ_TZ pour choisir le fuseau 36 horaire. Si la variable n'est pas définie, nous 37 sommes en France... 38 */ 32 39 TimeZone::TimeZone() 33 //34 // Constructeur par défaut. Il lit la variable35 // d'environnement ACQ_TZ pour choisir le fuseau36 // horaire. Si la variable n'est pas définie, nous37 // sommes en France...38 //--39 40 { 40 41 char* p = getenv("ACQ_TZ"); … … 47 48 } 48 49 49 // ++50 //! Constructeur à partir du nom d'un fuseau horaire. 50 51 TimeZone::TimeZone(const char* nom) 51 //52 // Constructeur à partir du nom d'un fuseau horaire.53 //--54 52 { 55 53 SetZone(nom); 56 54 } 57 55 58 //++ 56 /*! 57 Choisit un fuseau horaire. Contient la définition 58 du fuseau "France" (GMT+1, DST : dernier dimanche 59 de mars - dernier dimanche de septembre, c'est-à-dire 60 pré-gouvernement Juppé), et Chili (GMT-4, DST : 61 deuxième dimanche d'octobre - deuxième dimanche de mars). 62 */ 59 63 void TimeZone::SetZone(const char* nom) 60 //61 // Choisit un fuseau horaire. Contient la définition62 // du fuseau "France" (GMT+1, DST : dernier dimanche63 // de mars - dernier dimanche de septembre, c'est-à-dire64 // pré-gouvernement Juppé), et Chili (GMT-4, DST :65 // deuxième dimanche d'octobre - deuxième dimanche de mars).66 //--67 64 { 68 65 if (!strcmp(nom,"France")) { … … 96 93 } 97 94 98 // ++95 //! Teste si une date est en heure d'été (DST). 99 96 int TimeZone::IsDst(const Date& date) 100 //101 // Teste si une date est en heure d'été (DST).102 //--103 97 { 104 98 Date dt = date; … … 139 133 } 140 134 141 //++ 135 /*! 136 Retourne la difference TL-GMT pour une date donnée, 137 en tenant compte de l'heure d'été éventuelle. 138 */ 142 139 int TimeZone::GetOffset(const Date& date) 143 //144 // Retourne la difference TL-GMT pour une date donnée,145 // en tenant compte de l'heure d'été éventuelle.146 //--147 140 { 148 141 return IsDst(date) ? gmtOffset+dstOffset : gmtOffset; 149 142 } 150 143 151 //++ 152 // Class Date 153 // Lib Outils++ 154 // include dates.h 155 // 156 // Une classe date comme une autre, avec gestion 157 // temps local / GMT / changement d'heure, et un 158 // jour temps sidéral. 159 // 160 // Une partie de la date (heure, jour...) peut être 161 // indéterminée. Les comparaisons sont alors faites 162 // de façon astucieuse... 163 // 164 // La date peut être déterminée de minuit à minuit 165 // ou de midi à midi (nuit d'observation). Logique 166 // complexe et peut-être foireuse pour passer de 167 // l'un à l'autre, mais pas encore d'ennuis pour le 168 // moment... Une date-nuit doit avoir une heure 169 // indéterminée. 170 // 171 // Il faut que Date::gTimeZone soit initialisé pour 172 // éviter des gros pépins, mais PeidaInit() le fait. 173 // 174 // An 2000 : Lorsqu'on gère des dates sous forme de chaine : 175 // * En sortie, 2 caractères pour l'année entre 1950 et 1999 176 // et 4 caractères sinon 177 // * En entrée, si AA<100 on ajoute 1900. 178 //-- 179 180 //++ 144 145 146 /*! 147 \class Date 148 \ingroup NTools 149 Date manipulation classe 150 \warning Unless necessary, DO NOT USE this class. 151 Use SOPHYA::TimeStamp instead. 152 153 \verbatim 154 155 Une classe date comme une autre, avec gestion 156 temps local / GMT / changement d'heure, et un 157 jour temps sidéral. 158 159 Une partie de la date (heure, jour...) peut être 160 indéterminée. Les comparaisons sont alors faites 161 de façon astucieuse... 162 163 La date peut être déterminée de minuit à minuit 164 ou de midi à midi (nuit d'observation). Logique 165 complexe et peut-être foireuse pour passer de 166 l'un à l'autre, mais pas encore d'ennuis pour le 167 moment... Une date-nuit doit avoir une heure 168 indéterminée. 169 170 Il faut que Date::gTimeZone soit initialisé pour 171 éviter des gros pépins, mais PeidaInit() le fait. 172 173 An 2000 : Lorsqu'on gère des dates sous forme de chaine : 174 * En sortie, 2 caractères pour l'année entre 1950 et 1999 175 et 4 caractères sinon 176 * En entrée, si AA<100 on ajoute 1900. 177 178 */ 179 //! Retourne le nombre de jours dans le mois 181 180 short Date::MonthDays(short mois, short annee) 182 //183 // Retourne le nombre de jours dans le mois184 //--185 181 { 186 182 if (mois<1 || mois>12) throw ParmError(PExcLongMessage("")); … … 206 202 } 207 203 208 // ++204 //! Retourne le nombre de jours dans l'année 209 205 short Date::YearDays(short annee) 210 //211 // Retourne le nombre de jours dans l'année212 //--213 206 { 214 207 return (((annee%4 == 0) && (annee%100 != 0)) || (annee%400 == 0)) ? 366 : 365; 215 208 } 216 209 217 //++218 210 bool Date::UndetDate() const 219 / /220 // Retourne true si une partie de la date (jour 221 //ou mois ou année) est indéterminée.222 //-- 211 /*! 212 Retourne true si une partie de la date (jour 213 ou mois ou année) est indéterminée. 214 */ 223 215 { 224 216 return ((AA == -1) || (MM == -1) || (JJ == -1)); 225 217 } 226 218 227 //++ 219 /*! 220 Retourne true si toute la date (jour 221 et mois et année) est indéterminée. 222 */ 228 223 bool Date::AllUndetDate() const 229 //230 // Retourne true si toute la date (jour231 // et mois et année) est indéterminée.232 //--233 224 { 234 225 return ((AA == -1) && (MM == -1) && (JJ == -1)); 235 226 } 236 227 237 //++238 228 bool Date::UndetTime() const 239 / /240 //Retourne true si une partie de l'heure (heure241 //ou minutes ou secondes) est indéterminée.242 //-- 229 /*! 230 Retourne true si une partie de l'heure (heure 231 ou minutes ou secondes) est indéterminée. 232 */ 243 233 { 244 234 return ((hh == -1) || (mm == -1) || (ss == -1)); 245 235 } 246 236 247 //++ 237 238 /*! 239 Retourne true si toute l'heure (heure 240 et minutes et secondes) est indéterminée. 241 */ 248 242 bool Date::AllUndetTime() const 249 //250 // Retourne true si toute l'heure (heure251 // et minutes et secondes) est indéterminée.252 //--253 243 { 254 244 return ((hh == -1) && (mm == -1) && (ss == -1)); … … 257 247 //Date::operator double() const 258 248 259 // ++249 //! Jours écoulés depuis le 0 janvier 1901 0h TU 260 250 double 261 251 Date::GetDays() const 262 //263 // Jours écoulés depuis le 0 janvier 1901 0h TU264 //--265 252 { 266 253 if (UndetTime() && !AllUndetTime()) throw ParmError(PExcLongMessage("")); … … 281 268 } 282 269 283 // ++270 //! Initialisation a partir jours écoulés depuis le 0 janvier 1901 0h TU 284 271 void Date::Set(double t) 285 //286 // Jours écoulés depuis le 0 janvier 1901 0h TU287 //--288 272 { 289 273 t += 1/8640000.0; … … 323 307 nuit = 0; 324 308 } 325 //++ 309 310 //! Constructeur. Prend l'heure courante... 326 311 Date::Date() 327 //328 // Constructeur. Prend l'heure courante...329 //--330 312 : timeZone(gTimeZone) 331 313 { … … 342 324 } 343 325 344 // ++326 //! Constructeur simple. 345 327 Date::Date(int J, int M, int A, int h, int m, double s) 346 //347 // Constructeur simple.348 //--349 328 : JJ(J), MM(M), AA(A), hh(h), mm(m), ss(s), timeZone(gTimeZone), nuit(0) 350 329 { 351 330 } 352 331 353 // ++332 //! Constructeur à partir des jours écoulés depuis le 0 janvier 1901 0h TU 354 333 Date::Date(double t) 355 //356 // Constructeur à partir des357 // jours écoulés depuis le 0 janvier 1901 0h TU358 //359 //--360 334 : timeZone(gTimeZone) 361 335 { … … 363 337 } 364 338 365 // ++339 //! On change de fuseau horaire. 366 340 void Date::SetTimeZone(TimeZone* tz) 367 //368 // On change de fuseau horaire.369 //--370 341 { 371 342 timeZone = tz; 372 343 } 373 344 374 //++ 345 /*! 346 Constructeur à partir de la date sous la forme 347 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 348 (par défaut) ou Date::kLocalTime. 349 */ 375 350 Date::Date(const char* date, const char* heure, int tOpt) 376 //377 // Constructeur à partir de la date sous la forme378 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime379 // (par défaut) ou Date::kLocalTime.380 //381 // Tout ou partie de la date peut être indéterminée ('??').382 //--383 351 : timeZone(gTimeZone) 384 352 { … … 386 354 } 387 355 388 //++ 356 /*! 357 Constructeur à partir de la date sous la forme 358 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 359 (par défaut) ou Date::kLocalTime. 360 361 Tout ou partie de la date peut être indéterminée ('??'). 362 */ 389 363 Date::Date(string const& date, string const& heure, int tOpt) 390 //391 // Constructeur à partir de la date sous la forme392 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime393 // (par défaut) ou Date::kLocalTime.394 //395 // Tout ou partie de la date peut être indéterminée ('??').396 //--397 364 : timeZone(gTimeZone) 398 365 { … … 400 367 } 401 368 402 //++ 369 /*! 370 Positionne la date sous la forme 371 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 372 (par défaut) ou Date::kLocalTime. 373 374 Tout ou partie de la date peut être indéterminée ('??'). 375 */ 403 376 void Date::Set(string const& date, string const& heure, int tOpt) 404 //405 // Positionne la date sous la forme406 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime407 // (par défaut) ou Date::kLocalTime.408 //409 // Tout ou partie de la date peut être indéterminée ('??').410 //--411 377 { 412 378 Set(date.c_str(), heure == "" ? (char*)NULL : heure.c_str(), tOpt); 413 379 } 414 380 415 //++ 381 /*! 382 Positionne la date sous la forme 383 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime 384 (par défaut) ou Date::kLocalTime. 385 386 Tout ou partie de la date peut être indéterminée ('??'). 387 */ 416 388 void Date::Set(const char* date, const char* heure, int tOpt) 417 //418 // Positionne la date sous la forme419 // 'DD/MM/YYYY' 'HH/MM/SS', et tOpt est Date::kGMTTime420 // (par défaut) ou Date::kLocalTime.421 //422 // Tout ou partie de la date peut être indéterminée ('??').423 //--424 389 { 425 390 nuit = 0; … … 538 503 } 539 504 540 //++ 505 /*! 506 Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY' 507 en tOpt = Date::kGMTTime ou Date::kLocalTime. 508 */ 541 509 void Date::GetDateStr(char* s, int tOpt) const 542 //543 // Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'544 // en tOpt = Date::kGMTTime ou Date::kLocalTime.545 //--546 510 { 547 511 Date dt(*this); … … 566 530 } 567 531 568 // ++532 //! Code EROS de la date. 569 533 void Date::GetDateCode(char* s, int tOpt) const 570 //571 // Code EROS de la date.572 //--573 534 { 574 535 Date dt(*this); … … 603 564 } 604 565 605 // ++566 //! Récupère l'heure sous la forme 'HH:MM:SS' 606 567 void Date::GetTimeStr(char* s, int tOpt) const 607 //608 // Récupère l'heure sous la forme 'HH:MM:SS'609 //--610 568 { 611 569 Date dt(*this); … … 624 582 } 625 583 626 // ++584 //! Récupèrera un jour le temps sidéral. 627 585 void Date::GetSidTStr(char* s) const 628 //629 // Récupèrera un jour le temps sidéral.630 //--631 586 { 632 587 strcpy(s,"TOBEDONE!!"); 633 588 } 634 589 635 //++636 590 string Date::DateStr(int tOpt) const 637 / /638 //Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY'639 //en tOpt = Date::kGMTTime ou Date::kLocalTime.640 //-- 591 /*! 592 Récupère la date sous la forme d'une chaîne 'DD/MM/YYYY' 593 en tOpt = Date::kGMTTime ou Date::kLocalTime. 594 */ 641 595 { 642 596 char s[20]; … … 645 599 } 646 600 647 // ++601 //! Code EROS de la date. 648 602 string Date::DateCode(int tOpt) const 649 //650 // Code EROS de la date.651 //--652 603 { 653 604 char s[20]; … … 656 607 } 657 608 658 // ++609 //! Récupère l'heure sous la forme 'HH:MM:SS' 659 610 string Date::TimeStr(int tOpt) const 660 //661 // Récupère l'heure sous la forme 'HH:MM:SS'662 //--663 611 { 664 612 char s[20]; … … 667 615 } 668 616 669 // ++617 //! Récupèrera un jour le temps sidéral. 670 618 string Date::SidTStr() const 671 //672 // Récupèrera un jour le temps sidéral.673 //--674 619 { 675 620 char s[20]; … … 678 623 } 679 624 680 // ++625 //! Retourne le jour dans la semaine, 0-6 avec 0 = Date::jour_Lundi. 681 626 int Date::DayOfWeek(int tOpt) const 682 //683 // Retourne le jour dans la semaine, 0-6684 // avec 0 = Date::jour_Lundi.685 //--686 627 { 687 628 double t = GetDays(); … … 696 637 } 697 638 698 //++ 639 /*! 640 Retourne la date correspondant au ieme joursem dans le mois 641 correspondant (exemple, 2e dimanche de mars 1960). 642 */ 699 643 short Date::NthMonthDay(short i, short joursem, short mois, short annee) 700 //701 // Retourne la date correspondant au ieme joursem dans le mois702 // correspondant (exemple, 2e dimanche de mars 1960).703 //--704 644 { 705 645 if (i>0) { … … 717 657 } 718 658 719 // ++659 //! Ajout un nombre \b dt en jours 720 660 Date& Date::operator += (double dt) 721 //722 // dt en jours723 //--724 661 { 725 662 int u = UndetTime(); … … 729 666 } 730 667 731 // ++668 //! retranche un intervalle de temps \b dt en jours 732 669 Date& Date::operator -= (double dt) 733 //734 // dt en jours735 //--736 670 { 737 671 int u = UndetTime(); … … 741 675 } 742 676 743 //++744 677 Date operator + (Date const& d, double dt) 745 //746 //--747 678 { 748 679 Date a(d); … … 751 682 } 752 683 753 //++754 684 Date operator - (Date const& d, double dt) 755 //756 //--757 685 { 758 686 Date a(d); … … 761 689 } 762 690 763 // ++691 //! Résultat en jours 764 692 double operator - (Date const& a, Date const& b) 765 //766 // Résultat en jours767 //--768 693 { 769 694 if (a.UndetTime() != b.UndetTime()) throw ParmError(PExcLongMessage("")); … … 772 697 } 773 698 774 // ++699 //! On n'a pas égalite dès que des éléments déterminés sont différents 775 700 bool operator == (Date const& a, Date const& b) 776 //777 // On n'a pas égalite dès que des éléments déterminés sont différents778 //--779 701 { 780 702 if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12) … … 792 714 } 793 715 794 //++795 716 bool operator != (Date const& a, Date const& b) 796 //797 //--798 717 { 799 718 return !(a == b); 800 719 } 801 720 802 // ++721 //! Inégalité large. Pas de subtilités 803 722 bool operator <= (Date const& a, Date const& b) 804 //805 // Inégalité large. Pas de subtilités806 //--807 723 { 808 724 if (a.nuit && a.UndetTime() && !b.nuit && !b.UndetTime() && b.hh<12) … … 838 754 } 839 755 840 //++ 756 /*! 757 Inégalité stricte, codée à partir de la large pour résoudre 758 sans cas particuliers les subtilités 759 01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95 760 */ 841 761 bool operator < (Date const& a, Date const& b) 842 //843 // Inégalité stricte, codée à partir de la large pour résoudre844 // sans cas particuliers les subtilités845 // 01/02/95 < ??/03/95 mais pas 01/02/95 < ??/02/95846 //--847 762 { 848 763 return (a <= b) && !(a == b); 849 764 } 850 765 851 //++852 766 bool operator >= (Date const& a, Date const& b) 853 //854 //--855 767 { 856 768 return (b <= a); 857 769 } 858 770 859 //++860 771 bool operator > (Date const& a, Date const& b) 861 //862 //--863 772 { 864 773 return (b < a); 865 774 } 866 775 867 //++868 776 ostream& operator << (ostream& s, Date const& d) 869 //870 //--871 777 { 872 778 char x[20]; … … 877 783 return s; 878 784 } 785
Note:
See TracChangeset
for help on using the changeset viewer.