1#include <basis/seadRawPrint.h>
2#include <container/seadSafeArray.h>
3#include <time/seadCalendarTime.h>
4#include <time/seadDateUtil.h>
5
6namespace sead
7{
8const CalendarTime::Month CalendarTime::cMonth_Jan = 1;
9const CalendarTime::Month CalendarTime::cMonth_Feb = 2;
10const CalendarTime::Month CalendarTime::cMonth_Mar = 3;
11const CalendarTime::Month CalendarTime::cMonth_Apr = 4;
12const CalendarTime::Month CalendarTime::cMonth_May = 5;
13const CalendarTime::Month CalendarTime::cMonth_Jun = 6;
14const CalendarTime::Month CalendarTime::cMonth_Jul = 7;
15const CalendarTime::Month CalendarTime::cMonth_Aug = 8;
16const CalendarTime::Month CalendarTime::cMonth_Sep = 9;
17const CalendarTime::Month CalendarTime::cMonth_Oct = 10;
18const CalendarTime::Month CalendarTime::cMonth_Nov = 11;
19const CalendarTime::Month CalendarTime::cMonth_Dec = 12;
20
21const CalendarTime::Year CalendarTime::cDefaultYear = 1970;
22const CalendarTime::Month CalendarTime::cDefaultMonth = 1;
23const CalendarTime::Day CalendarTime::cDefaultDay = 1;
24const CalendarTime::Hour CalendarTime::cDefaultHour = 0;
25const CalendarTime::Minute CalendarTime::cDefaultMinute = 0;
26const CalendarTime::Second CalendarTime::cDefaultSecond = 0;
27
28void CalendarTime::Year::setValue(u32 year)
29{
30 mValue = year;
31}
32
33CalendarTime::Month::Month(u32 month)
34{
35 setValueOneOrigin(month);
36}
37
38void CalendarTime::Month::setValueOneOrigin(u32 m)
39{
40 SEAD_ASSERT_MSG(1 <= m && m <= 12, "wrong month. correct range is [1, 12]. your param %d", m);
41 mValue = m;
42}
43
44s32 CalendarTime::Month::addSelf(u32 rhs)
45{
46 const s32 val = (s32(rhs) + mValue + -1) % 12;
47 mValue = val + 1;
48 SEAD_ASSERT(1 <= mValue && mValue <= 12);
49 return val;
50}
51
52s32 CalendarTime::Month::subSelf(u32 rhs)
53{
54 const s32 val = (mValue - s32(rhs) % 12 + 12 - 1) % 12u;
55 mValue = val + 1;
56 SEAD_ASSERT(1 <= mValue && mValue <= 12);
57 return val;
58}
59
60s32 CalendarTime::Month::sub(CalendarTime::Month rhs) const
61{
62 return s32(mValue) - rhs.getValueOneOrigin();
63}
64
65SafeString CalendarTime::Month::makeStringOneOrigin(u32 m)
66{
67 SEAD_ASSERT_MSG(1 <= m && m <= 12, "wrong month. correct range is [1, 12]. your param %d", m);
68 switch (m)
69 {
70 case 1:
71 return "Jan";
72 case 2:
73 return "Feb";
74 case 3:
75 return "Mar";
76 case 4:
77 return "Apr";
78 case 5:
79 return "May";
80 case 6:
81 return "Jun";
82 case 7:
83 return "Jul";
84 case 8:
85 return "Aug";
86 case 9:
87 return "Sep";
88 case 10:
89 return "Oct";
90 case 11:
91 return "Nov";
92 case 12:
93 default:
94 return "Dec";
95 }
96}
97
98CalendarTime::Month CalendarTime::Month::makeFromValueOneOrigin(u32 m)
99{
100 SEAD_ASSERT(1 <= m && m <= 12);
101 return Month(m);
102}
103
104void CalendarTime::Day::setValue(u32 day)
105{
106 SEAD_ASSERT_MSG(1 <= day && day <= 31, "wrong day. correct range is [1, 31]. your param %d",
107 day);
108 mValue = day;
109}
110
111void CalendarTime::Hour::setValue(u32 hour)
112{
113 SEAD_ASSERT_MSG(hour <= 23, "wrong hour. correct range is [0, 23]. your param %d", hour);
114 mValue = hour;
115}
116
117void CalendarTime::Minute::setValue(u32 minute)
118{
119 SEAD_ASSERT_MSG(minute <= 59, "wrong minute. correct range is [0, 59]. your param %d", minute);
120 mValue = minute;
121}
122
123void CalendarTime::Second::setValue(u32 second)
124{
125 SEAD_ASSERT_MSG(second <= 59, "wrong day. correct range is [0, 59]. your param %d", second);
126 mValue = second;
127}
128
129CalendarTime::Date::Date(const CalendarTime::Year& y, const CalendarTime::Month& m,
130 const CalendarTime::Day& d)
131 : mYear(y), mMonth(m), mDay(d)
132{
133 mWeek = DateUtil::calcWeekDay(year: y, month: m, day: d);
134}
135
136CalendarTime::Time::Time(const CalendarTime::Hour& h, const CalendarTime::Minute& m,
137 const CalendarTime::Second& s)
138 : mHour(h), mMinute(m), mSecond(s)
139{
140}
141
142CalendarTime::CalendarTime(const CalendarTime::Date& date, const CalendarTime::Time& time)
143 : mDate(date), mTime(time)
144{
145}
146
147CalendarTime::CalendarTime(const CalendarTime::Year& y, const CalendarTime::Month& m,
148 const CalendarTime::Day& d, const CalendarTime::Hour& hour,
149 const CalendarTime::Minute& minute, const CalendarTime::Second& second)
150 : mDate(y, m, d), mTime(hour, minute, second)
151{
152}
153
154void CalendarTime::setDate(const CalendarTime::Date& date)
155{
156 mDate = date;
157 mDate.calcWeek();
158}
159
160u32 CalendarTime::getYearDays() const
161{
162 const u32 m = mDate.mMonth.getValueOneOrigin();
163 SEAD_ASSERT_MSG(1 <= m && m <= 12, "wrong month. correct range is [1, 12]. your param %d", m);
164
165 static const u32 sCumulativeNumberOfDays[] = {
166 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
167 };
168 u32 num_days = mDate.mDay.getValue() + sCumulativeNumberOfDays[m - 1];
169
170 if (m >= 3)
171 num_days += DateUtil::isLeapYear(year: mDate.mYear.getValue());
172
173 return num_days;
174}
175
176void CalendarTime::Date::calcWeek()
177{
178 mWeek = DateUtil::calcWeekDay(year: mYear, month: mMonth, day: mDay);
179}
180
181void CalendarTime::makeWeekDayNameLabel_(BufferedSafeString* out_str, CalendarTime::Week week)
182{
183 static const SafeArray<const char*, 7> labels = {.mBuffer: {"日", "月", "火", "水", "木", "金", "土"}};
184 out_str->format(formatStr: "曜日:%s", labels[s32(week)]);
185}
186
187} // namespace sead
188