Zeit.cpp 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957
  1. #include "Zeit.h"
  2. #include <ctime>
  3. #include <time.h>
  4. #include "Text.h"
  5. #ifdef WIN32
  6. # include "Fenster.h"
  7. #else
  8. # include <string.h>
  9. # include <sys/time.h>
  10. #endif
  11. #ifdef WIN32
  12. # if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
  13. # define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
  14. # else
  15. # define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
  16. # endif
  17. struct timeval
  18. {
  19. long tv_sec; // Sekunden seit dem 1.1.1970
  20. long tv_usec; // und Mikrosekunden
  21. };
  22. struct timezone
  23. {
  24. int tz_minuteswest; // minutes W of Greenwich
  25. int tz_dsttime; // type of dst correction
  26. };
  27. int gettimeofday(struct timeval* tv, struct timezone* tz)
  28. {
  29. FILETIME ft;
  30. unsigned __int64 tmpres = 0;
  31. static int tzflag;
  32. if (NULL != tv)
  33. {
  34. GetSystemTimeAsFileTime(&ft);
  35. tmpres |= ft.dwHighDateTime;
  36. tmpres <<= 32;
  37. tmpres |= ft.dwLowDateTime;
  38. // converting file time to unix epoch
  39. tmpres -= DELTA_EPOCH_IN_MICROSECS;
  40. tmpres /= 10; // convert into microseconds
  41. tv->tv_sec = (long)(tmpres / 1000000UL);
  42. tv->tv_usec = (long)(tmpres % 1000000UL);
  43. }
  44. if (NULL != tz)
  45. {
  46. if (!tzflag)
  47. {
  48. _tzset();
  49. ++tzflag;
  50. }
  51. _get_timezone((long*)&(tz->tz_minuteswest));
  52. tz->tz_minuteswest /= 60;
  53. _get_daylight(&(tz->tz_dsttime));
  54. }
  55. return 0;
  56. }
  57. #endif
  58. using namespace Framework;
  59. // Inhalt der Uhrzeit Klasse aus Zeit.h
  60. // Privat
  61. int Uhrzeit::update() // berechnet die neue Zeit
  62. {
  63. int ret = 0;
  64. while (sekunde >= 60)
  65. {
  66. sekunde -= 60;
  67. ++minute;
  68. }
  69. while (minute >= 60)
  70. {
  71. minute -= 60;
  72. ++stunde;
  73. }
  74. while (stunde >= 24)
  75. {
  76. stunde -= 24;
  77. ++ret;
  78. }
  79. while (sekunde < 0)
  80. {
  81. sekunde += 60;
  82. --minute;
  83. }
  84. while (minute < 0)
  85. {
  86. minute += 60;
  87. --stunde;
  88. }
  89. while (stunde < 0)
  90. {
  91. stunde += 24;
  92. --ret;
  93. }
  94. return ret;
  95. }
  96. Uhrzeit::Uhrzeit()
  97. : ReferenceCounter(),
  98. stunde(0),
  99. minute(0),
  100. sekunde(0)
  101. {}
  102. int Uhrzeit::setUhrzeit(Uhrzeit* zeit) // setzt die Uhrzeit
  103. {
  104. stunde = zeit->getStunde();
  105. minute = zeit->getMinute();
  106. sekunde = zeit->getSekunde();
  107. zeit->release();
  108. return update();
  109. }
  110. int Uhrzeit::setUhrzeit(int stunde, int minute, int sekunde)
  111. {
  112. this->stunde = stunde;
  113. this->minute = minute;
  114. this->sekunde = sekunde;
  115. return update();
  116. }
  117. int Uhrzeit::setUhrzeit(
  118. const char* format, const char* zeit) // format Beispiele: "H:i:s", "H-i-s"
  119. // (H=stunde,i=minute,s=sekunde)
  120. {
  121. int flen = textLength(format);
  122. char* ende = 0;
  123. for (const char* f = format; f < format + flen; ++f)
  124. {
  125. switch (*f)
  126. {
  127. case 'h':
  128. stunde = TextZuInt(zeit, &ende, 10);
  129. zeit = ende;
  130. ende = 0;
  131. break;
  132. case 'i':
  133. minute = TextZuInt(zeit, &ende, 10);
  134. zeit = ende;
  135. ende = 0;
  136. break;
  137. case 's':
  138. sekunde = TextZuInt(zeit, &ende, 10);
  139. zeit = ende;
  140. ende = 0;
  141. break;
  142. default:
  143. ++zeit;
  144. break;
  145. }
  146. }
  147. return update();
  148. }
  149. int Uhrzeit::setUhrzeit(const char* format, Text* zeit)
  150. {
  151. int ret = setUhrzeit(format, zeit->getText());
  152. zeit->release();
  153. return ret;
  154. }
  155. int Uhrzeit::setStunde(int stunde) // setzt die Stunde
  156. {
  157. this->stunde = stunde;
  158. return update();
  159. }
  160. int Uhrzeit::setMinute(int minute) // setzt die Minute
  161. {
  162. this->minute = minute;
  163. return update();
  164. }
  165. int Uhrzeit::setSekunde(int sekunde) // setzt die Sekunde
  166. {
  167. this->sekunde = sekunde;
  168. return update();
  169. }
  170. int Uhrzeit::plusUhrzeit(Uhrzeit* zeit) // addiert die zeiten
  171. {
  172. stunde += zeit->getStunde();
  173. minute += zeit->getMinute();
  174. sekunde += zeit->getSekunde();
  175. return update();
  176. }
  177. int Uhrzeit::plusUhrzeit(int stunde, int minute, int sekunde)
  178. {
  179. this->stunde += stunde;
  180. this->minute += minute;
  181. this->sekunde += sekunde;
  182. return update();
  183. }
  184. int Uhrzeit::plusUhrzeit(const char* format, const char* zeit)
  185. {
  186. int flen = textLength(format);
  187. char* ende = 0;
  188. for (const char* f = format; f < format + flen; ++f)
  189. {
  190. switch (*f)
  191. {
  192. case 'h':
  193. stunde += TextZuInt(zeit, &ende, 10);
  194. zeit = ende;
  195. ende = 0;
  196. break;
  197. case 'i':
  198. minute += TextZuInt(zeit, &ende, 10);
  199. zeit = ende;
  200. ende = 0;
  201. break;
  202. case 's':
  203. sekunde += TextZuInt(zeit, &ende, 10);
  204. zeit = ende;
  205. ende = 0;
  206. break;
  207. default:
  208. ++zeit;
  209. break;
  210. }
  211. }
  212. return update();
  213. }
  214. int Uhrzeit::plusUhrzeit(const char* format, Text* zeit)
  215. {
  216. int ret = plusUhrzeit(format, zeit->getText());
  217. zeit->release();
  218. return ret;
  219. }
  220. int Uhrzeit::plusStunde(int stunde) // addiert stunde Stunden
  221. {
  222. this->stunde += stunde;
  223. return update();
  224. }
  225. int Uhrzeit::plusMinute(int minute) // addiert minute Minuten
  226. {
  227. this->minute += minute;
  228. return update();
  229. }
  230. int Uhrzeit::plusSekunde(int sekunde) // addiert sekunde Sekunden
  231. {
  232. this->sekunde += sekunde;
  233. return update();
  234. }
  235. int Uhrzeit::minusUhrzeit(Uhrzeit* zeit) // subtrahiert die zeiten
  236. {
  237. stunde -= zeit->getStunde();
  238. minute -= zeit->getMinute();
  239. sekunde -= zeit->getSekunde();
  240. zeit->release();
  241. return update();
  242. }
  243. int Uhrzeit::minusUhrzeit(int stunde, int minute, int sekunde)
  244. {
  245. this->stunde -= stunde;
  246. this->minute -= minute;
  247. this->sekunde -= sekunde;
  248. return update();
  249. }
  250. int Uhrzeit::minusUhrzeit(const char* format, const char* zeit)
  251. {
  252. int flen = textLength(format);
  253. char* ende = 0;
  254. for (const char* f = format; f < format + flen; ++f)
  255. {
  256. switch (*f)
  257. {
  258. case 'h':
  259. stunde -= TextZuInt(zeit, &ende, 10);
  260. zeit = ende;
  261. ende = 0;
  262. break;
  263. case 'i':
  264. minute -= TextZuInt(zeit, &ende, 10);
  265. zeit = ende;
  266. ende = 0;
  267. break;
  268. case 's':
  269. sekunde -= TextZuInt(zeit, &ende, 10);
  270. zeit = ende;
  271. ende = 0;
  272. break;
  273. default:
  274. ++zeit;
  275. break;
  276. }
  277. }
  278. return update();
  279. }
  280. int Uhrzeit::minusUhrzeit(const char* format, Text* zeit)
  281. {
  282. int ret = plusUhrzeit(format, zeit->getText());
  283. zeit->release();
  284. return ret;
  285. }
  286. int Uhrzeit::minusStunde(int stunde) // subtrahiert stunde Stunden
  287. {
  288. this->stunde -= stunde;
  289. return update();
  290. }
  291. int Uhrzeit::minusMinute(int minute) // subtrahiert minute Minuten
  292. {
  293. this->minute -= minute;
  294. return update();
  295. }
  296. int Uhrzeit::minusSekunde(int sekunde) // subtrahiert sekunde Sekunden
  297. {
  298. this->sekunde -= sekunde;
  299. return update();
  300. }
  301. // constant
  302. int Uhrzeit::getStunde() const // gibt die Stunde zurück
  303. {
  304. return stunde;
  305. }
  306. int Uhrzeit::getMinute() const // gibt die Minute zurück
  307. {
  308. return minute;
  309. }
  310. int Uhrzeit::getSekunde() const // gibt die Sekunde zurück
  311. {
  312. return sekunde;
  313. }
  314. Text* Uhrzeit::getUhrzeit(
  315. const char* format) const // gibt die Uhrzeit als Text formatiert zurück
  316. {
  317. Text* ret = new Text("");
  318. int flen = textLength(format);
  319. for (const char* f = format; f < format + flen; ++f)
  320. {
  321. switch (*f)
  322. {
  323. case 'h':
  324. ret->append(stunde);
  325. break;
  326. case 'i':
  327. ret->append(minute);
  328. break;
  329. case 's':
  330. ret->append(sekunde);
  331. break;
  332. default:
  333. ret->append(f, 1);
  334. break;
  335. }
  336. }
  337. return ret;
  338. }
  339. bool Uhrzeit::istGleich(
  340. Uhrzeit* zeit) const // prüft, ob die Uhrzeit gleich zeit ist
  341. {
  342. bool ret = stunde == zeit->getStunde() && minute == zeit->getMinute()
  343. && sekunde == zeit->getSekunde();
  344. zeit->release();
  345. return ret;
  346. }
  347. bool Uhrzeit::istGleich(const char* format, const char* zeit) const
  348. {
  349. int st = stunde, min = minute, sek = sekunde;
  350. int flen = textLength(format);
  351. char* ende = 0;
  352. for (const char* f = format; f < format + flen; ++f)
  353. {
  354. switch (*f)
  355. {
  356. case 'h':
  357. st = TextZuInt(zeit, &ende, 10);
  358. zeit = ende;
  359. ende = 0;
  360. break;
  361. case 'i':
  362. min = TextZuInt(zeit, &ende, 10);
  363. zeit = ende;
  364. ende = 0;
  365. break;
  366. case 's':
  367. sek = TextZuInt(zeit, &ende, 10);
  368. zeit = ende;
  369. ende = 0;
  370. break;
  371. default:
  372. ++zeit;
  373. break;
  374. }
  375. }
  376. bool ret = stunde == st && minute == min && sekunde == sek;
  377. return ret;
  378. }
  379. bool Uhrzeit::istGleich(const char* format, Text* zeit) const
  380. {
  381. bool ret = istGleich(format, zeit->getText());
  382. zeit->release();
  383. return ret;
  384. }
  385. bool Uhrzeit::istGleich(int stunde, int minute, int sekunde) const
  386. {
  387. return this->stunde == stunde && this->minute == minute
  388. && this->sekunde == sekunde;
  389. }
  390. bool Uhrzeit::stundeGleich(
  391. int stunde) const // prüft, ob die Stunde gleich stunde ist
  392. {
  393. return this->stunde == stunde;
  394. }
  395. bool Uhrzeit::minuteGleich(
  396. int minute) const // prüft, ob die Minute gleich minute ist
  397. {
  398. return this->minute == minute;
  399. }
  400. bool Uhrzeit::sekundeGleich(
  401. int sekunde) const // prüft, ob die Sekunde gleich sekunde ist
  402. {
  403. return this->sekunde == sekunde;
  404. }
  405. bool Uhrzeit::istKleiner(
  406. Uhrzeit* zeit) const // prüft, ob die Zeit kleiner als zeit ist
  407. {
  408. bool ret
  409. = istKleiner(zeit->getStunde(), zeit->getMinute(), zeit->getSekunde());
  410. zeit->release();
  411. return ret;
  412. }
  413. bool Uhrzeit::istKleiner(int stunde, int minute, int sekunde) const
  414. {
  415. if (this->stunde < stunde)
  416. return 1;
  417. else if (this->stunde == stunde)
  418. {
  419. if (this->minute < minute)
  420. return 1;
  421. else if (this->minute == minute)
  422. {
  423. if (this->sekunde < sekunde)
  424. return 1;
  425. else if (this->sekunde == sekunde)
  426. return 0;
  427. else
  428. return 0;
  429. }
  430. else
  431. return 0;
  432. }
  433. else
  434. return 0;
  435. }
  436. bool Uhrzeit::istKleiner(const char* format, const char* zeit) const
  437. {
  438. int st = stunde, min = minute, sek = sekunde;
  439. int flen = textLength(format);
  440. char* ende = 0;
  441. for (const char* f = format; f < format + flen; ++f)
  442. {
  443. switch (*f)
  444. {
  445. case 'h':
  446. st = TextZuInt(zeit, &ende, 10);
  447. zeit = ende;
  448. ende = 0;
  449. break;
  450. case 'i':
  451. min = TextZuInt(zeit, &ende, 10);
  452. zeit = ende;
  453. ende = 0;
  454. break;
  455. case 's':
  456. sek = TextZuInt(zeit, &ende, 10);
  457. zeit = ende;
  458. ende = 0;
  459. break;
  460. default:
  461. ++zeit;
  462. break;
  463. }
  464. }
  465. return istKleiner(st, min, sek);
  466. }
  467. bool Uhrzeit::istKleiner(const char* format, Text* zeit) const
  468. {
  469. bool ret = istKleiner(format, zeit->getText());
  470. zeit->release();
  471. return ret;
  472. }
  473. bool Uhrzeit::istLater(
  474. Uhrzeit* zeit) const // prüft, ob die Zeit größer als zeit ist
  475. {
  476. bool ret
  477. = istLater(zeit->getStunde(), zeit->getMinute(), zeit->getSekunde());
  478. zeit->release();
  479. return ret;
  480. }
  481. bool Uhrzeit::istLater(int stunde, int minute, int sekunde) const
  482. {
  483. if (this->stunde > stunde)
  484. return 1;
  485. else if (this->stunde == stunde)
  486. {
  487. if (this->minute > minute)
  488. return 1;
  489. else if (this->minute == minute)
  490. {
  491. if (this->sekunde > sekunde)
  492. return 1;
  493. else if (this->sekunde == sekunde)
  494. return 0;
  495. else
  496. return 0;
  497. }
  498. else
  499. return 0;
  500. }
  501. else
  502. return 0;
  503. }
  504. bool Uhrzeit::istLater(const char* format, const char* zeit) const
  505. {
  506. int st = stunde, min = minute, sek = sekunde;
  507. int flen = textLength(format);
  508. char* ende = 0;
  509. for (const char* f = format; f < format + flen; ++f)
  510. {
  511. switch (*f)
  512. {
  513. case 'h':
  514. st = TextZuInt(zeit, &ende, 10);
  515. zeit = ende;
  516. ende = 0;
  517. break;
  518. case 'i':
  519. min = TextZuInt(zeit, &ende, 10);
  520. zeit = ende;
  521. ende = 0;
  522. break;
  523. case 's':
  524. sek = TextZuInt(zeit, &ende, 10);
  525. zeit = ende;
  526. ende = 0;
  527. break;
  528. default:
  529. ++zeit;
  530. break;
  531. }
  532. }
  533. return istLater(st, min, sek);
  534. }
  535. bool Uhrzeit::istLater(const char* format, Text* zeit) const
  536. {
  537. bool ret = istLater(format, zeit->getText());
  538. zeit->release();
  539. return ret;
  540. }
  541. // Inhalt der Datum Klasse aus Zeit.h
  542. // Privat
  543. void Datum::update() // berechnet die neue Zeit
  544. {
  545. while (monat > 12)
  546. {
  547. monat -= 12;
  548. ++jahr;
  549. }
  550. while (monat <= 0)
  551. {
  552. monat += 12;
  553. --jahr;
  554. }
  555. if (istSchaltjahr(jahr))
  556. maxTage[1] = 29;
  557. else
  558. maxTage[1] = 28;
  559. while (tag > maxTage[monat - 1])
  560. {
  561. tag -= maxTage[monat - 1];
  562. ++monat;
  563. if (monat > 12)
  564. {
  565. monat -= 12;
  566. ++jahr;
  567. if (istSchaltjahr(jahr))
  568. maxTage[1] = 29;
  569. else
  570. maxTage[1] = 28;
  571. }
  572. }
  573. while (tag <= 0)
  574. {
  575. tag += maxTage[(monat - 2 > 0 ? monat - 2 : 11)];
  576. --monat;
  577. if (monat <= 0)
  578. {
  579. monat += 12;
  580. --jahr;
  581. if (istSchaltjahr(jahr))
  582. maxTage[1] = 29;
  583. else
  584. maxTage[1] = 28;
  585. }
  586. }
  587. }
  588. // Konstruktor
  589. Datum::Datum()
  590. : ReferenceCounter(),
  591. jahr(0),
  592. monat(0),
  593. tag(0)
  594. {
  595. int maxT[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  596. maxTage = new int[12];
  597. memcpy(maxTage, maxT, 12 * sizeof(int));
  598. }
  599. // Destruktor
  600. Datum::~Datum()
  601. {
  602. delete[] maxTage;
  603. }
  604. // nicht constant
  605. void Datum::setDatum(Datum* datum) // setzt das Datum
  606. {
  607. jahr = datum->getJahr();
  608. monat = datum->getMonat();
  609. tag = datum->getTag();
  610. datum->release();
  611. update();
  612. }
  613. void Datum::setDatum(int jahr, int monat, int tag)
  614. {
  615. this->jahr = jahr;
  616. this->monat = monat;
  617. this->tag = tag;
  618. update();
  619. }
  620. void Datum::setDatum(const char* format,
  621. const char*
  622. datum) // format Beispiele: "Y:m:d", "Y-m-d" (Y=Jahr,m=Monat,d=tag)
  623. {
  624. int flen = textLength(format);
  625. char* ende = 0;
  626. for (const char* f = format; f < format + flen; ++f)
  627. {
  628. switch (*f)
  629. {
  630. case 'y':
  631. jahr = TextZuInt(datum, &ende, 10);
  632. datum = ende;
  633. ende = 0;
  634. break;
  635. case 'm':
  636. monat = TextZuInt(datum, &ende, 10);
  637. datum = ende;
  638. ende = 0;
  639. break;
  640. case 'd':
  641. tag = TextZuInt(datum, &ende, 10);
  642. datum = ende;
  643. ende = 0;
  644. break;
  645. default:
  646. ++datum;
  647. break;
  648. }
  649. }
  650. update();
  651. }
  652. void Datum::setDatum(const char* format, Text* datum)
  653. {
  654. setDatum(format, datum->getText());
  655. datum->release();
  656. }
  657. void Datum::setJahr(int jahr) // setzt das Jahr
  658. {
  659. this->jahr = jahr;
  660. update();
  661. }
  662. void Datum::setMonat(int monat) // setzt den Monat
  663. {
  664. this->monat = monat;
  665. update();
  666. }
  667. void Datum::setTag(int tag) // setzt den Tag
  668. {
  669. this->tag = tag;
  670. update();
  671. }
  672. void Datum::plusDatum(Datum* datum) // addiert das datum
  673. {
  674. this->jahr += datum->getJahr();
  675. this->monat += datum->getMonat();
  676. this->tag += datum->getTag();
  677. datum->release();
  678. update();
  679. }
  680. void Datum::plusDatum(int jahr, int monat, int tag)
  681. {
  682. this->jahr += jahr;
  683. this->monat += monat;
  684. this->tag += tag;
  685. update();
  686. }
  687. void Datum::plusDatum(const char* format, const char* datum)
  688. {
  689. int flen = textLength(format);
  690. char* ende = 0;
  691. for (const char* f = format; f < format + flen; ++f)
  692. {
  693. switch (*f)
  694. {
  695. case 'y':
  696. jahr += TextZuInt(datum, &ende, 10);
  697. datum = ende;
  698. ende = 0;
  699. break;
  700. case 'm':
  701. monat += TextZuInt(datum, &ende, 10);
  702. datum = ende;
  703. ende = 0;
  704. break;
  705. case 'd':
  706. tag += TextZuInt(datum, &ende, 10);
  707. datum = ende;
  708. ende = 0;
  709. break;
  710. default:
  711. ++datum;
  712. break;
  713. }
  714. }
  715. update();
  716. }
  717. void Datum::plusDatum(const char* format, Text* datum)
  718. {
  719. plusDatum(format, datum->getText());
  720. datum->release();
  721. }
  722. void Datum::plusJahr(int jahr) // addiert jahr Jahre
  723. {
  724. this->jahr += jahr;
  725. update();
  726. }
  727. void Datum::plusMonat(int monat) // addiert monat Monate
  728. {
  729. this->monat = monat;
  730. update();
  731. }
  732. void Datum::plusTag(int tag) // addiert tag Tage
  733. {
  734. this->tag += tag;
  735. update();
  736. }
  737. void Datum::minusDatum(Datum* datum) // subtrahiert das datum
  738. {
  739. jahr -= datum->getJahr();
  740. monat -= datum->getMonat();
  741. tag -= datum->getTag();
  742. datum->release();
  743. update();
  744. }
  745. void Datum::minusDatum(int jahr, int monat, int tag)
  746. {
  747. this->jahr -= jahr;
  748. this->monat -= monat;
  749. this->tag -= tag;
  750. update();
  751. }
  752. void Datum::minusDatum(const char* format, const char* datum)
  753. {
  754. int flen = textLength(format);
  755. char* ende = 0;
  756. for (const char* f = format; f < format + flen; ++f)
  757. {
  758. switch (*f)
  759. {
  760. case 'y':
  761. jahr -= TextZuInt(datum, &ende, 10);
  762. datum = ende;
  763. ende = 0;
  764. break;
  765. case 'm':
  766. monat -= TextZuInt(datum, &ende, 10);
  767. datum = ende;
  768. ende = 0;
  769. break;
  770. case 'd':
  771. tag -= TextZuInt(datum, &ende, 10);
  772. datum = ende;
  773. ende = 0;
  774. break;
  775. default:
  776. ++datum;
  777. break;
  778. }
  779. }
  780. update();
  781. }
  782. void Datum::minusDatum(const char* format, Text* datum)
  783. {
  784. minusDatum(format, datum->getText());
  785. datum->release();
  786. }
  787. void Datum::minusJahr(int jahr) // subtrahiert jahr Jahre
  788. {
  789. this->jahr -= jahr;
  790. update();
  791. }
  792. void Datum::minusMonat(int monat) // subtrahiert monat Monate
  793. {
  794. this->monat -= monat;
  795. update();
  796. }
  797. void Datum::minusTag(int tag) // subtrahiert tag Tage
  798. {
  799. this->tag -= tag;
  800. update();
  801. }
  802. // constant
  803. int Datum::getJahr() const // gibt das Jahr zurück
  804. {
  805. return jahr;
  806. }
  807. int Datum::getMonat() const // gibt der Monat zurück
  808. {
  809. return monat;
  810. }
  811. int Datum::getTag() const // gibt der Tag zurück
  812. {
  813. return tag;
  814. }
  815. Text* Datum::getDatum(
  816. const char* format) const // gibt das Datum als Text formatiert zurück
  817. {
  818. Text* ret = new Text("");
  819. int flen = textLength(format);
  820. for (const char* f = format; f < format + flen; ++f)
  821. {
  822. switch (*f)
  823. {
  824. case 'y':
  825. ret->append(jahr);
  826. break;
  827. case 'm':
  828. ret->append(monat);
  829. break;
  830. case 'd':
  831. ret->append(tag);
  832. break;
  833. default:
  834. ret->append(f, 1);
  835. break;
  836. }
  837. }
  838. return ret;
  839. }
  840. bool Datum::istGleich(
  841. Datum* datum) const // prüft, ob das Datum gleich datum ist
  842. {
  843. bool ret = jahr == datum->getJahr() && monat == datum->getMonat()
  844. && tag == datum->getTag();
  845. datum->release();
  846. return ret;
  847. }
  848. bool Datum::istGleich(const char* format, const char* datum) const
  849. {
  850. int j = jahr, m = monat, t = tag;
  851. int flen = textLength(format);
  852. char* ende = 0;
  853. for (const char* f = format; f < format + flen; ++f)
  854. {
  855. switch (*f)
  856. {
  857. case 'y':
  858. j = TextZuInt(datum, &ende, 10);
  859. datum = ende;
  860. ende = 0;
  861. break;
  862. case 'm':
  863. m = TextZuInt(datum, &ende, 10);
  864. datum = ende;
  865. ende = 0;
  866. break;
  867. case 'd':
  868. t = TextZuInt(datum, &ende, 10);
  869. datum = ende;
  870. ende = 0;
  871. break;
  872. default:
  873. ++datum;
  874. break;
  875. }
  876. }
  877. bool ret = jahr == j && monat == m && tag == t;
  878. return ret;
  879. }
  880. bool Datum::istGleich(const char* format, Text* datum) const
  881. {
  882. bool ret = istGleich(format, datum->getText());
  883. datum->release();
  884. return ret;
  885. }
  886. bool Datum::istGleich(int jahr, int monat, int tag) const
  887. {
  888. return this->jahr == jahr && this->monat == monat && this->tag == tag;
  889. }
  890. bool Datum::jahrGleich(int jahr) const // prüft, ob das Jahr gleich jahr ist
  891. {
  892. return this->jahr == jahr;
  893. }
  894. bool Datum::monatGleich(int monat) const // prüft, ob der Monat gleich monat ist
  895. {
  896. return this->monat == monat;
  897. }
  898. bool Datum::tagGleich(int tag) const // prüft, ob der Tag gleich tag ist
  899. {
  900. return this->tag == tag;
  901. }
  902. bool Datum::istKleiner(
  903. Datum* datum) const // prüft, ob die Datum kleiner als datum ist
  904. {
  905. bool ret = istKleiner(datum->getJahr(), datum->getMonat(), datum->getTag());
  906. datum->release();
  907. return ret;
  908. }
  909. bool Datum::istKleiner(int jahr, int monat, int tag) const
  910. {
  911. if (this->jahr < jahr)
  912. return 1;
  913. else if (this->jahr == jahr)
  914. {
  915. if (this->monat < monat)
  916. return 1;
  917. else if (this->monat == monat)
  918. {
  919. if (this->tag < tag)
  920. return 1;
  921. else if (this->tag == tag)
  922. return 0;
  923. else
  924. return 0;
  925. }
  926. else
  927. return 0;
  928. }
  929. else
  930. return 0;
  931. }
  932. bool Datum::istKleiner(const char* format, const char* datum) const
  933. {
  934. int j = jahr, m = monat, t = tag;
  935. int flen = textLength(format);
  936. char* ende = 0;
  937. for (const char* f = format; f < format + flen; ++f)
  938. {
  939. switch (*f)
  940. {
  941. case 'y':
  942. j = TextZuInt(datum, &ende, 10);
  943. datum = ende;
  944. ende = 0;
  945. break;
  946. case 'm':
  947. m = TextZuInt(datum, &ende, 10);
  948. datum = ende;
  949. ende = 0;
  950. break;
  951. case 'd':
  952. t = TextZuInt(datum, &ende, 10);
  953. datum = ende;
  954. ende = 0;
  955. break;
  956. default:
  957. ++datum;
  958. break;
  959. }
  960. }
  961. return istKleiner(j, m, t);
  962. }
  963. bool Datum::istKleiner(const char* format, Text* datum) const
  964. {
  965. bool ret = istKleiner(format, datum->getText());
  966. datum->release();
  967. return ret;
  968. }
  969. bool Datum::istLater(
  970. Datum* datum) const // prüft, ob die Datum größer als datum ist
  971. {
  972. bool ret = istLater(datum->getJahr(), datum->getMonat(), datum->getTag());
  973. datum->release();
  974. return ret;
  975. }
  976. bool Datum::istLater(int jahr, int monat, int tag) const
  977. {
  978. if (this->jahr > jahr)
  979. return 1;
  980. else if (this->jahr == jahr)
  981. {
  982. if (this->monat > monat)
  983. return 1;
  984. else if (this->monat == monat)
  985. {
  986. if (this->tag > tag)
  987. return 1;
  988. else if (this->tag == tag)
  989. return 0;
  990. else
  991. return 0;
  992. }
  993. else
  994. return 0;
  995. }
  996. else
  997. return 0;
  998. }
  999. bool Datum::istLater(const char* format, const char* datum) const
  1000. {
  1001. int j = jahr, m = monat, t = tag;
  1002. int flen = textLength(format);
  1003. char* ende = 0;
  1004. for (const char* f = format; f < format + flen; ++f)
  1005. {
  1006. switch (*f)
  1007. {
  1008. case 'y':
  1009. j = TextZuInt(datum, &ende, 10);
  1010. datum = ende;
  1011. ende = 0;
  1012. break;
  1013. case 'm':
  1014. m = TextZuInt(datum, &ende, 10);
  1015. datum = ende;
  1016. ende = 0;
  1017. break;
  1018. case 'd':
  1019. t = TextZuInt(datum, &ende, 10);
  1020. datum = ende;
  1021. ende = 0;
  1022. break;
  1023. default:
  1024. ++datum;
  1025. break;
  1026. }
  1027. }
  1028. return istLater(j, m, t);
  1029. }
  1030. bool Datum::istLater(const char* format, Text* datum) const
  1031. {
  1032. bool ret = istLater(format, datum->getText());
  1033. datum->release();
  1034. return ret;
  1035. }
  1036. // Inhalt der Zeit Klasse aus Zeit.h
  1037. // Konstruktor
  1038. Zeit::Zeit()
  1039. : ReferenceCounter(),
  1040. datum(new Datum()),
  1041. uhrzeit(new Uhrzeit())
  1042. {}
  1043. // Destruktor
  1044. Zeit::~Zeit()
  1045. {
  1046. datum->release();
  1047. uhrzeit->release();
  1048. }
  1049. // nicht constant
  1050. void Zeit::setZeit(Zeit* zeit) // setzt die Zeit
  1051. {
  1052. datum->setDatum(zeit->getDatum());
  1053. datum->plusTag(uhrzeit->setUhrzeit(zeit->getUhrzeit()));
  1054. zeit->release();
  1055. }
  1056. void Zeit::setZeit(
  1057. int jahr, int monat, int tag, int stunde, int minute, int sekunde)
  1058. {
  1059. datum->setDatum(jahr, monat, tag);
  1060. datum->plusTag(uhrzeit->setUhrzeit(stunde, minute, sekunde));
  1061. }
  1062. void Zeit::setZeit(const char* format,
  1063. const char* zeit) // format Beispiele: "Y:m:d H-i-s", "Y-m-d H:i:s"
  1064. // (Y=Jahr,m=Monat,d=tag,H=stunde,i=minute,s=sekunde)
  1065. {
  1066. int y = datum->getJahr();
  1067. int m = datum->getMonat();
  1068. int d = datum->getTag();
  1069. int h = uhrzeit->getStunde();
  1070. int i = uhrzeit->getMinute();
  1071. int s = uhrzeit->getSekunde();
  1072. int flen = textLength(format);
  1073. char* ende = 0;
  1074. for (const char* f = format; f < format + flen; ++f)
  1075. {
  1076. switch (*f)
  1077. {
  1078. case 'y':
  1079. y = TextZuInt(zeit, &ende, 10);
  1080. zeit = ende;
  1081. ende = 0;
  1082. break;
  1083. case 'm':
  1084. m = TextZuInt(zeit, &ende, 10);
  1085. zeit = ende;
  1086. ende = 0;
  1087. break;
  1088. case 'd':
  1089. d = TextZuInt(zeit, &ende, 10);
  1090. zeit = ende;
  1091. ende = 0;
  1092. break;
  1093. case 'h':
  1094. h = TextZuInt(zeit, &ende, 10);
  1095. zeit = ende;
  1096. ende = 0;
  1097. break;
  1098. case 'i':
  1099. i = TextZuInt(zeit, &ende, 10);
  1100. zeit = ende;
  1101. ende = 0;
  1102. break;
  1103. case 's':
  1104. s = TextZuInt(zeit, &ende, 10);
  1105. zeit = ende;
  1106. ende = 0;
  1107. break;
  1108. default:
  1109. ++zeit;
  1110. break;
  1111. }
  1112. }
  1113. datum->setDatum(y, m, d);
  1114. datum->plusTag(uhrzeit->setUhrzeit(h, i, s));
  1115. }
  1116. void Zeit::setZeit(const char* format, Text* zeit)
  1117. {
  1118. setZeit(format, zeit->getText());
  1119. zeit->release();
  1120. }
  1121. void Zeit::setJahr(int jahr) // setzt das Jahr
  1122. {
  1123. datum->setJahr(jahr);
  1124. }
  1125. void Zeit::setMonat(int monat) // setzt den Monat
  1126. {
  1127. datum->setMonat(monat);
  1128. }
  1129. void Zeit::setTag(int tag) // setzt den Tag
  1130. {
  1131. datum->setTag(tag);
  1132. }
  1133. void Zeit::setStunde(int stunde) // setzt die Stunde
  1134. {
  1135. datum->plusTag(uhrzeit->setStunde(stunde));
  1136. }
  1137. void Zeit::setMinute(int minute) // setzt die Minute
  1138. {
  1139. datum->plusTag(uhrzeit->setMinute(minute));
  1140. }
  1141. void Zeit::setSekunde(int sekunde) // setzt die Sekunde
  1142. {
  1143. datum->plusTag(uhrzeit->setSekunde(sekunde));
  1144. }
  1145. void Zeit::plusZeit(Zeit* zeit) // addiert die zeit
  1146. {
  1147. datum->plusDatum(zeit->getDatum());
  1148. datum->plusTag(uhrzeit->plusUhrzeit(zeit->getUhrzeit()));
  1149. zeit->release();
  1150. }
  1151. void Zeit::plusZeit(
  1152. int jahr, int monat, int tag, int stunde, int minute, int sekunde)
  1153. {
  1154. datum->plusDatum(jahr, monat, tag);
  1155. datum->plusTag(uhrzeit->plusUhrzeit(stunde, minute, sekunde));
  1156. }
  1157. void Zeit::plusZeit(const char* format, const char* zeit)
  1158. {
  1159. int y = datum->getJahr();
  1160. int m = datum->getMonat();
  1161. int d = datum->getTag();
  1162. int h = uhrzeit->getStunde();
  1163. int i = uhrzeit->getMinute();
  1164. int s = uhrzeit->getSekunde();
  1165. int flen = textLength(format);
  1166. char* ende = 0;
  1167. for (const char* f = format; f < format + flen; ++f)
  1168. {
  1169. switch (*f)
  1170. {
  1171. case 'y':
  1172. y += TextZuInt(zeit, &ende, 10);
  1173. zeit = ende;
  1174. ende = 0;
  1175. break;
  1176. case 'm':
  1177. m += TextZuInt(zeit, &ende, 10);
  1178. zeit = ende;
  1179. ende = 0;
  1180. break;
  1181. case 'd':
  1182. d += TextZuInt(zeit, &ende, 10);
  1183. zeit = ende;
  1184. ende = 0;
  1185. break;
  1186. case 'h':
  1187. h += TextZuInt(zeit, &ende, 10);
  1188. zeit = ende;
  1189. ende = 0;
  1190. break;
  1191. case 'i':
  1192. i += TextZuInt(zeit, &ende, 10);
  1193. zeit = ende;
  1194. ende = 0;
  1195. break;
  1196. case 's':
  1197. s += TextZuInt(zeit, &ende, 10);
  1198. zeit = ende;
  1199. ende = 0;
  1200. break;
  1201. default:
  1202. ++zeit;
  1203. break;
  1204. }
  1205. }
  1206. datum->setDatum(y, m, d);
  1207. datum->plusTag(uhrzeit->setUhrzeit(h, i, s));
  1208. }
  1209. void Zeit::plusZeit(const char* format, Text* zeit)
  1210. {
  1211. plusZeit(format, zeit->getText());
  1212. zeit->release();
  1213. }
  1214. void Zeit::plusJahr(int jahr) // addiert jahr Jahre
  1215. {
  1216. datum->plusJahr(jahr);
  1217. }
  1218. void Zeit::plusMonat(int monat) // addiert monat Monate
  1219. {
  1220. datum->plusMonat(monat);
  1221. }
  1222. void Zeit::plusTag(int tag) // addiert tag Tage
  1223. {
  1224. datum->plusTag(tag);
  1225. }
  1226. void Zeit::plusStunde(int stunde) // addiert stunde Stunden
  1227. {
  1228. datum->plusTag(uhrzeit->plusStunde(stunde));
  1229. }
  1230. void Zeit::plusMinute(int minute) // addiert minute Minuten
  1231. {
  1232. datum->plusTag(uhrzeit->plusMinute(minute));
  1233. }
  1234. void Zeit::plusSekunde(int sekunde) // addiert sekunde Sekunden
  1235. {
  1236. datum->plusTag(uhrzeit->plusSekunde(sekunde));
  1237. }
  1238. void Zeit::minusZeit(Zeit* zeit) // subtrahiert die zeit
  1239. {
  1240. datum->minusDatum(zeit->getDatum());
  1241. datum->plusTag(uhrzeit->minusUhrzeit(zeit->getUhrzeit()));
  1242. zeit->release();
  1243. }
  1244. void Zeit::minusZeit(
  1245. int jahr, int monat, int tag, int stunde, int minute, int sekunde)
  1246. {
  1247. datum->minusDatum(jahr, monat, tag);
  1248. datum->plusTag(uhrzeit->plusUhrzeit(stunde, minute, sekunde));
  1249. }
  1250. void Zeit::minusZeit(const char* format, const char* zeit)
  1251. {
  1252. int y = datum->getJahr();
  1253. int m = datum->getMonat();
  1254. int d = datum->getTag();
  1255. int h = uhrzeit->getStunde();
  1256. int i = uhrzeit->getMinute();
  1257. int s = uhrzeit->getSekunde();
  1258. int flen = textLength(format);
  1259. char* ende = 0;
  1260. for (const char* f = format; f < format + flen; ++f)
  1261. {
  1262. switch (*f)
  1263. {
  1264. case 'y':
  1265. y -= TextZuInt(zeit, &ende, 10);
  1266. zeit = ende;
  1267. ende = 0;
  1268. break;
  1269. case 'm':
  1270. m -= TextZuInt(zeit, &ende, 10);
  1271. zeit = ende;
  1272. ende = 0;
  1273. break;
  1274. case 'd':
  1275. d -= TextZuInt(zeit, &ende, 10);
  1276. zeit = ende;
  1277. ende = 0;
  1278. break;
  1279. case 'h':
  1280. h += TextZuInt(zeit, &ende, 10);
  1281. zeit = ende;
  1282. ende = 0;
  1283. break;
  1284. case 'i':
  1285. i -= TextZuInt(zeit, &ende, 10);
  1286. zeit = ende;
  1287. ende = 0;
  1288. break;
  1289. case 's':
  1290. s -= TextZuInt(zeit, &ende, 10);
  1291. zeit = ende;
  1292. ende = 0;
  1293. break;
  1294. default:
  1295. ++zeit;
  1296. break;
  1297. }
  1298. }
  1299. datum->setDatum(y, m, d);
  1300. datum->plusTag(uhrzeit->setUhrzeit(h, i, s));
  1301. }
  1302. void Zeit::minusZeit(const char* format, Text* zeit)
  1303. {
  1304. minusZeit(format, zeit->getText());
  1305. zeit->release();
  1306. }
  1307. void Zeit::minusJahr(int jahr) // subtrahiert jahr Jahre
  1308. {
  1309. datum->minusJahr(jahr);
  1310. }
  1311. void Zeit::minusMonat(int monat) // subtrahiert monat Monate
  1312. {
  1313. datum->minusMonat(monat);
  1314. }
  1315. void Zeit::minusTag(int tag) // subtrahiert tag Tage
  1316. {
  1317. datum->minusTag(tag);
  1318. }
  1319. void Zeit::minusStunde(int stunde) // subtrahiert stunde Stunden
  1320. {
  1321. datum->plusTag(uhrzeit->minusStunde(stunde));
  1322. }
  1323. void Zeit::minusMinute(int minute) // subtrahiert minute Minuten
  1324. {
  1325. datum->plusTag(uhrzeit->minusMinute(minute));
  1326. }
  1327. void Zeit::minusSekunde(int sekunde) // subtrahiert sekunde Sekunden
  1328. {
  1329. datum->plusTag(uhrzeit->minusSekunde(sekunde));
  1330. }
  1331. // constant
  1332. Text* Zeit::getZeit(
  1333. const char* format) const // gibt die Zeit als Text formatiert zurück
  1334. {
  1335. Text* ret = new Text("");
  1336. int flen = textLength(format);
  1337. for (const char* f = format; f < format + flen; ++f)
  1338. {
  1339. switch (*f)
  1340. {
  1341. case 'y':
  1342. ret->append(datum->getJahr());
  1343. break;
  1344. case 'm':
  1345. ret->append(datum->getMonat());
  1346. break;
  1347. case 'd':
  1348. ret->append(datum->getTag());
  1349. break;
  1350. case 'h':
  1351. ret->append(uhrzeit->getStunde());
  1352. break;
  1353. case 'i':
  1354. ret->append(uhrzeit->getMinute());
  1355. break;
  1356. case 's':
  1357. ret->append(uhrzeit->getSekunde());
  1358. break;
  1359. default:
  1360. ret->append(f, 1);
  1361. }
  1362. }
  1363. return ret;
  1364. }
  1365. bool Zeit::istGleich(Zeit* zeit) const // prüft, ob die Uhrzeit gleich zeit ist
  1366. {
  1367. bool ret = datum->istGleich(zeit->getDatum())
  1368. && uhrzeit->istGleich(zeit->getUhrzeit());
  1369. zeit->release();
  1370. return ret;
  1371. }
  1372. bool Zeit::istGleich(const char* format, const char* zeit) const
  1373. {
  1374. int y = datum->getJahr();
  1375. int m = datum->getMonat();
  1376. int d = datum->getTag();
  1377. int h = uhrzeit->getStunde();
  1378. int i = uhrzeit->getMinute();
  1379. int s = uhrzeit->getSekunde();
  1380. int flen = textLength(format);
  1381. char* ende = 0;
  1382. for (const char* f = format; f < format + flen; ++f)
  1383. {
  1384. switch (*f)
  1385. {
  1386. case 'y':
  1387. y = TextZuInt(zeit, &ende, 10);
  1388. zeit = ende;
  1389. ende = 0;
  1390. break;
  1391. case 'm':
  1392. m = TextZuInt(zeit, &ende, 10);
  1393. zeit = ende;
  1394. ende = 0;
  1395. break;
  1396. case 'd':
  1397. d = TextZuInt(zeit, &ende, 10);
  1398. zeit = ende;
  1399. ende = 0;
  1400. break;
  1401. case 'h':
  1402. h = TextZuInt(zeit, &ende, 10);
  1403. zeit = ende;
  1404. ende = 0;
  1405. break;
  1406. case 'i':
  1407. i = TextZuInt(zeit, &ende, 10);
  1408. zeit = ende;
  1409. ende = 0;
  1410. break;
  1411. case 's':
  1412. s = TextZuInt(zeit, &ende, 10);
  1413. zeit = ende;
  1414. ende = 0;
  1415. break;
  1416. default:
  1417. ++zeit;
  1418. break;
  1419. }
  1420. }
  1421. return datum->istGleich(y, m, d) && uhrzeit->istGleich(h, i, s);
  1422. }
  1423. bool Zeit::istGleich(const char* format, Text* zeit) const
  1424. {
  1425. bool ret = istGleich(format, zeit->getText());
  1426. zeit->release();
  1427. return ret;
  1428. }
  1429. bool Zeit::istGleich(
  1430. int jahr, int monat, int tag, int stunde, int minute, int sekunde) const
  1431. {
  1432. return datum->istGleich(jahr, monat, tag)
  1433. && uhrzeit->istGleich(stunde, minute, sekunde);
  1434. }
  1435. Datum* Zeit::getDatum() const // gibt das Datum zurück
  1436. {
  1437. return dynamic_cast<Datum*>(datum->getThis());
  1438. }
  1439. Datum* Zeit::zDatum() const
  1440. {
  1441. return datum;
  1442. }
  1443. Uhrzeit* Zeit::getUhrzeit() const // gibt die Uhrzeit zurück
  1444. {
  1445. return dynamic_cast<Uhrzeit*>(uhrzeit->getThis());
  1446. }
  1447. Uhrzeit* Zeit::zUhrzeit() const
  1448. {
  1449. return uhrzeit;
  1450. }
  1451. bool Zeit::istKleiner(
  1452. Zeit* zeit) const // prüft, ob die Zeit kleiner als zeit ist
  1453. {
  1454. if (datum->istKleiner(zeit->getDatum()))
  1455. {
  1456. zeit->release();
  1457. return 1;
  1458. }
  1459. else if (datum->istGleich(zeit->getDatum()))
  1460. {
  1461. if (uhrzeit->istKleiner(zeit->getUhrzeit()))
  1462. {
  1463. zeit->release();
  1464. return 1;
  1465. }
  1466. else
  1467. {
  1468. zeit->release();
  1469. return 0;
  1470. }
  1471. }
  1472. else
  1473. {
  1474. zeit->release();
  1475. return 0;
  1476. }
  1477. }
  1478. bool Zeit::istKleiner(
  1479. int jahr, int monat, int tag, int stunde, int minute, int sekunde) const
  1480. {
  1481. if (datum->istKleiner(jahr, monat, tag))
  1482. return 1;
  1483. else if (datum->istGleich(jahr, monat, tag))
  1484. {
  1485. if (uhrzeit->istKleiner(stunde, minute, sekunde))
  1486. return 1;
  1487. else
  1488. return 0;
  1489. }
  1490. else
  1491. return 0;
  1492. }
  1493. bool Zeit::istKleiner(const char* format, const char* zeit) const
  1494. {
  1495. int y = datum->getJahr();
  1496. int m = datum->getMonat();
  1497. int d = datum->getTag();
  1498. int h = uhrzeit->getStunde();
  1499. int i = uhrzeit->getMinute();
  1500. int s = uhrzeit->getSekunde();
  1501. int flen = textLength(format);
  1502. char* ende = 0;
  1503. for (const char* f = format; f < format + flen; ++f)
  1504. {
  1505. switch (*f)
  1506. {
  1507. case 'y':
  1508. y = TextZuInt(zeit, &ende, 10);
  1509. zeit = ende;
  1510. ende = 0;
  1511. break;
  1512. case 'm':
  1513. m = TextZuInt(zeit, &ende, 10);
  1514. zeit = ende;
  1515. ende = 0;
  1516. break;
  1517. case 'd':
  1518. d = TextZuInt(zeit, &ende, 10);
  1519. zeit = ende;
  1520. ende = 0;
  1521. break;
  1522. case 'h':
  1523. h = TextZuInt(zeit, &ende, 10);
  1524. zeit = ende;
  1525. ende = 0;
  1526. break;
  1527. case 'i':
  1528. i = TextZuInt(zeit, &ende, 10);
  1529. zeit = ende;
  1530. ende = 0;
  1531. break;
  1532. case 's':
  1533. s = TextZuInt(zeit, &ende, 10);
  1534. zeit = ende;
  1535. ende = 0;
  1536. break;
  1537. default:
  1538. ++zeit;
  1539. break;
  1540. }
  1541. }
  1542. if (datum->istKleiner(y, m, d))
  1543. return 1;
  1544. else if (datum->istGleich(y, m, d))
  1545. {
  1546. if (uhrzeit->istKleiner(h, i, s))
  1547. return 1;
  1548. else
  1549. return 0;
  1550. }
  1551. else
  1552. return 0;
  1553. }
  1554. bool Zeit::istKleiner(const char* format, Text* zeit) const
  1555. {
  1556. bool ret = istKleiner(format, zeit->getText());
  1557. zeit->release();
  1558. return ret;
  1559. }
  1560. bool Zeit::istLater(Zeit* zeit) const // prüft, ob die Zeit größer als zeit ist
  1561. {
  1562. if (datum->istLater(zeit->getDatum()))
  1563. {
  1564. zeit->release();
  1565. return 1;
  1566. }
  1567. else if (datum->istGleich(zeit->getDatum()))
  1568. {
  1569. if (uhrzeit->istLater(zeit->getUhrzeit()))
  1570. {
  1571. zeit->release();
  1572. return 1;
  1573. }
  1574. else
  1575. {
  1576. zeit->release();
  1577. return 0;
  1578. }
  1579. }
  1580. else
  1581. {
  1582. zeit->release();
  1583. return 0;
  1584. }
  1585. }
  1586. bool Zeit::istLater(
  1587. int jahr, int monat, int tag, int stunde, int minute, int sekunde) const
  1588. {
  1589. if (datum->istLater(jahr, monat, tag))
  1590. return 1;
  1591. else if (datum->istGleich(jahr, monat, tag))
  1592. {
  1593. if (uhrzeit->istLater(stunde, minute, sekunde))
  1594. return 1;
  1595. else
  1596. return 0;
  1597. }
  1598. else
  1599. return 0;
  1600. }
  1601. bool Zeit::istLater(const char* format, const char* zeit) const
  1602. {
  1603. int y = datum->getJahr();
  1604. int m = datum->getMonat();
  1605. int d = datum->getTag();
  1606. int h = uhrzeit->getStunde();
  1607. int i = uhrzeit->getMinute();
  1608. int s = uhrzeit->getSekunde();
  1609. int flen = textLength(format);
  1610. char* ende = 0;
  1611. for (const char* f = format; f < format + flen; ++f)
  1612. {
  1613. switch (*f)
  1614. {
  1615. case 'y':
  1616. y = TextZuInt(zeit, &ende, 10);
  1617. zeit = ende;
  1618. ende = 0;
  1619. break;
  1620. case 'm':
  1621. m = TextZuInt(zeit, &ende, 10);
  1622. zeit = ende;
  1623. ende = 0;
  1624. break;
  1625. case 'd':
  1626. d = TextZuInt(zeit, &ende, 10);
  1627. zeit = ende;
  1628. ende = 0;
  1629. break;
  1630. case 'h':
  1631. h = TextZuInt(zeit, &ende, 10);
  1632. zeit = ende;
  1633. ende = 0;
  1634. break;
  1635. case 'i':
  1636. i = TextZuInt(zeit, &ende, 10);
  1637. zeit = ende;
  1638. ende = 0;
  1639. break;
  1640. case 's':
  1641. s = TextZuInt(zeit, &ende, 10);
  1642. zeit = ende;
  1643. ende = 0;
  1644. break;
  1645. default:
  1646. ++zeit;
  1647. break;
  1648. }
  1649. }
  1650. if (datum->istLater(y, m, d))
  1651. return 1;
  1652. else if (datum->istGleich(y, m, d))
  1653. {
  1654. if (uhrzeit->istLater(h, i, s))
  1655. return 1;
  1656. else
  1657. return 0;
  1658. }
  1659. else
  1660. return 0;
  1661. }
  1662. bool Zeit::istLater(const char* format, Text* zeit) const
  1663. {
  1664. bool ret = istLater(format, zeit->getText());
  1665. zeit->release();
  1666. return ret;
  1667. }
  1668. // Inhalt der ZeitMesser Klasse aus Zeit.h
  1669. // Konstruktor
  1670. ZeitMesser::ZeitMesser()
  1671. : ReferenceCounter(),
  1672. start(0),
  1673. ende(0),
  1674. messung(0)
  1675. {}
  1676. // Destruktor
  1677. ZeitMesser::~ZeitMesser() {}
  1678. // nicht constant
  1679. void ZeitMesser::messungStart() // legt des Startpunkt der Zeitmessung fest
  1680. {
  1681. timeval tv;
  1682. gettimeofday(&tv, 0);
  1683. start = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
  1684. }
  1685. void ZeitMesser::messungEnde() // legt des Endpunkt der Zeitmessung fest
  1686. {
  1687. timeval tv;
  1688. gettimeofday(&tv, 0);
  1689. ende = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0;
  1690. messung = ende - start;
  1691. }
  1692. // constant
  1693. double ZeitMesser::getSekunden()
  1694. const // gibt den sekundenabstand zwischen start und ende der Messung zurück
  1695. {
  1696. return messung;
  1697. }
  1698. double ZeitMesser::getMinuten()
  1699. const // gibt den minutenabstand zwischen start und ende der Messung zurück
  1700. {
  1701. return messung / 60;
  1702. }
  1703. double ZeitMesser::getStunden()
  1704. const // gibt den stundenabstand zwischen start und ende der Messung zurück
  1705. {
  1706. return messung / 3600;
  1707. }
  1708. //! gibt true zurück, wenn aktuell eine MEssung läuft
  1709. DLLEXPORT bool ZeitMesser::isMeasuring() const
  1710. {
  1711. return start != 0;
  1712. }
  1713. // Globale Funktionen
  1714. Uhrzeit* Framework::getUhrzeit() // gibt die aktuelle Uhrzeit zurück
  1715. {
  1716. #ifdef WIN32
  1717. Uhrzeit* ret = new Uhrzeit();
  1718. time_t Zeitstempel = time(0);
  1719. tm now;
  1720. localtime_s(&now, &Zeitstempel);
  1721. ret->setUhrzeit(now.tm_hour, now.tm_min, now.tm_sec);
  1722. return ret;
  1723. #else
  1724. Uhrzeit* ret = new Uhrzeit();
  1725. time_t Zeitstempel = time(0);
  1726. tm* now = localtime(&Zeitstempel);
  1727. ret->setUhrzeit(now->tm_hour, now->tm_min, now->tm_sec);
  1728. return ret;
  1729. #endif
  1730. }
  1731. Datum* Framework::getDatum() // gibt das aktuelle Datum zurück
  1732. {
  1733. #ifdef WIN32
  1734. Datum* ret = new Datum();
  1735. time_t Zeitstempel = time(0);
  1736. tm now;
  1737. localtime_s(&now, &Zeitstempel);
  1738. ret->setDatum(now.tm_year + 1900, now.tm_mon + 1, now.tm_mday);
  1739. return ret;
  1740. #else
  1741. Datum* ret = new Datum();
  1742. time_t Zeitstempel = time(0);
  1743. tm* now = localtime(&Zeitstempel);
  1744. ret->setDatum(now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);
  1745. return ret;
  1746. #endif
  1747. }
  1748. Zeit* Framework::getZeit() // gibt die aktuelle Zeit( Datum und Uhrzeit ) zurück
  1749. {
  1750. #ifdef WIN32
  1751. Zeit* ret = new Zeit();
  1752. time_t Zeitstempel = time(0);
  1753. tm now;
  1754. localtime_s(&now, &Zeitstempel);
  1755. ret->setZeit(now.tm_year + 1900,
  1756. now.tm_mon + 1,
  1757. now.tm_mday,
  1758. now.tm_hour,
  1759. now.tm_min,
  1760. now.tm_sec);
  1761. return ret;
  1762. #else
  1763. Zeit* ret = new Zeit();
  1764. time_t Zeitstempel = time(0);
  1765. tm* now = localtime(&Zeitstempel);
  1766. ret->setZeit(now->tm_year + 1900,
  1767. now->tm_mon + 1,
  1768. now->tm_mday,
  1769. now->tm_hour,
  1770. now->tm_min,
  1771. now->tm_sec);
  1772. return ret;
  1773. #endif
  1774. }
  1775. bool Framework::istSchaltjahr(int jahr) // prüft, ob jahr ein Schaltjahr ist
  1776. {
  1777. if (jahr % 4 == 0)
  1778. {
  1779. if (jahr % 100 == 0)
  1780. {
  1781. if (jahr % 400 == 0)
  1782. return true;
  1783. else
  1784. return false;
  1785. }
  1786. else
  1787. return true;
  1788. }
  1789. else
  1790. return false;
  1791. }