1 // Datum.java
2 package formattable;
3
4 import java.util.Calendar;
5 import java.util.Formatter;
6 import java.util.Formattable;
7 import static java.util.FormattableFlags.LEFT_JUSTIFY;
8 import java.util.IllegalFormatPrecisionException;
9
10 /** 11 * Datum ist ein Bauplan für formatierbare Datumswerte. 12 * Beispielprogramm zur Programmiertechnik 1, Teil 5. 13 * @author H.Drachenfels 14 * @version 19.2.2024 15 */
16 public final class Datum implements Formattable {
17 private final int tag;
18 private final int monat;
19 private final int jahr;
20
21 private Datum(int tag, int monat, int jahr) {
22 this.tag = tag;
23 this.monat = monat;
24 this.jahr = jahr;
25 }
26
27 /** 28 * Fabrikmethode, die ein value object mit dem angegebenen Datum liefert. 29 * @param tag ist der Tag im Monat 30 * @param monat ist der Monat im Jahr 31 * @param jahr ist das Jahr 32 * @return Referenz auf das value object 33 */
34 public static Datum valueOf(int tag, int monat, int jahr) {
35 // Datum pruefen (stark vereinfacht)
36 if (tag < 1 || tag > 31 || monat < 1 || monat > 12) {
37 throw new IllegalArgumentException("ungueltiges Datum");
38 }
39
40 // value object erzeugen
41 return new Datum(tag, monat, jahr);
42 }
43
44 /** 45 * Fabrikmethode, die ein value object mit dem aktuellen Datum liefert. 46 * @return Referenz auf das value object 47 */
48 public static Datum heute() {
49 // Systemkalender ablesen
50 Calendar c = Calendar.getInstance();
51
52 // value object erzeugen
53 return new Datum(c.get(Calendar.DAY_OF_MONTH),
54 c.get(Calendar.MONTH) + 1,
55 c.get(Calendar.YEAR));
56 }
57
58 /** 59 * Liefert den Tag im Monat. 60 * @return Tag im Monat als Zahl 1 bis 31 61 */
62 public int tag() {
63 return this.tag;
64 }
65
66 /** 67 * Liefert den Monat. 68 * @return Monat als Zahl 1 bis 12 69 */
70 public int monat() {
71 return this.monat;
72 }
73
74 /** 75 * Liefert das Jahr. 76 * @return Jahr 77 */
78 public int jahr() {
79 return this.jahr;
80 }
81
82 @Override
83 public String toString() {
84 return String.format("%d-%02d-%02d", this.jahr, this.monat, this.tag);
85 }
86
87 @Override
88 public boolean equals(Object o) {
89 if (o instanceof Datum) {
90 Datum that = (Datum) o;
91 return this.tag == that.tag
92 && this.monat == that.monat
93 && this.jahr == that.jahr;
94 }
95
96 return false;
97 }
98
99 @Override
100 public int hashCode() {
101 return (this.jahr << 9) + (this.monat << 5) + this.tag;
102 }
103
104 @Override
105 public void formatTo(Formatter f, int flags, int width, int precision) {
106 if (precision != -1) {
107 throw new IllegalFormatPrecisionException(precision);
108 }
109
110 String dateString = this.toString();
111
112 if (width <= dateString.length()) {
113 f.format(dateString);
114 } else if ((flags & LEFT_JUSTIFY) == LEFT_JUSTIFY) {
115 f.format("%-" + width + "s", dateString);
116 } else {
117 f.format("%" + width + "s", dateString);
118 }
119 }
120 }
121