1 /* 2 * datum.cpp 3 * 4 * Beispielprogramm Klasse. 5 * 6 * Autor: H.Drachenfels 7 * Erstellt am: 16.11.2020 8 */
9 #include "datum.h"
10 #include <stdexcept>
11 #include <ctime>
12 #include <cstdio>
13 #include <iomanip>
14 #include <ios>
15 #include <string>
16
17 datum datum::heute()
18 {
19 std::time_t t = std::time(0);
20 std::tm *p = std::localtime(&t);
21 return {p->tm_mday, p->tm_mon + 1, p->tm_year + 1900};
22 }
23
24 datum::datum(int t, int m, int j)
25 : tag(t), monat(m), jahr(j)
26 {
27 // Konsistenzpruefung (stark vereinfacht)
28 if (t < 1 || t > 31 || m < 1 || m > 12)
29 {
30 throw std::invalid_argument("ungueltiges Datum");
31 }
32 }
33
34 bool operator==(const datum& lhs, const datum& rhs)
35 {
36 return &lhs == &rhs || (lhs.tag == rhs.tag
37 && lhs.monat == rhs.monat
38 && lhs.jahr == rhs.jahr);
39 }
40
41 std::ostream& operator<<(std::ostream& os, const datum& d)
42 {
43 return os << d.jahr
44 << '-' << std::setw(2) << std::setfill('0') << d.monat
45 << '-' << std::setw(2) << std::setfill('0') << d.tag;
46 }
47
48 std::istream& operator>>(std::istream& is, datum& d)
49 {
50 std::string eingabe;
51 if (!(is >> eingabe))
52 {
53 return is;
54 }
55
56 int j, m, t;
57 if (std::sscanf(eingabe.c_str(), "%d-%2d-%2d", &j, &m, &t) != 3)
58 {
59 is.setstate(std::ios::failbit);
60 return is;
61 }
62
63 try
64 {
65 d = {t, m, j}; // datum(t, m, j);
66 }
67 catch (std::invalid_argument&)
68 {
69 is.setstate(std::ios::failbit);
70 }
71
72 return is;
73 }
74