Skip to content

Commit 974bf7a

Browse files
committed
Implement reference solution for swift-scheduling practice exercise
1 parent c00c18b commit 974bf7a

File tree

1 file changed

+91
-1
lines changed

1 file changed

+91
-1
lines changed
Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,97 @@
1+
import java.time.DayOfWeek;
12
import java.time.LocalDateTime;
23

4+
import static java.time.DayOfWeek.*;
5+
36
public class SwiftScheduling {
47
public static LocalDateTime convertToDeliveryDate(LocalDateTime meetingStart, String description) {
5-
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
8+
if ("NOW".equals(description)) {
9+
return meetingStart.plusHours(2);
10+
}
11+
12+
if ("ASAP".equals(description)) {
13+
LocalDateTime sameDayAt1pm = toStartOfDay(meetingStart).withHour(13);
14+
15+
if (meetingStart.isBefore(sameDayAt1pm)) {
16+
return toStartOfDay(meetingStart).withHour(17);
17+
} else {
18+
return toStartOfDay(meetingStart).plusDays(1).withHour(13);
19+
}
20+
}
21+
22+
if ("EOW".equals(description)) {
23+
DayOfWeek day = meetingStart.getDayOfWeek();
24+
LocalDateTime deliveryDate = toStartOfDay(meetingStart);
25+
26+
if (day == MONDAY || day == TUESDAY || day == WEDNESDAY) {
27+
deliveryDate = deliveryDate.withHour(17);
28+
while (deliveryDate.getDayOfWeek() != FRIDAY) {
29+
deliveryDate = deliveryDate.plusDays(1);
30+
}
31+
} else if (day == THURSDAY || day == FRIDAY) {
32+
deliveryDate = deliveryDate.withHour(20);
33+
while (deliveryDate.getDayOfWeek() != SUNDAY) {
34+
deliveryDate = deliveryDate.plusDays(1);
35+
}
36+
} else {
37+
throw new IllegalArgumentException("Invalid day of week");
38+
}
39+
40+
return deliveryDate;
41+
}
42+
43+
if (description.matches("\\d+M")) {
44+
int month = Integer.parseInt(description.substring(0, description.length() - 1));
45+
LocalDateTime targetMonth = toStartOfDay(meetingStart)
46+
.withMonth(month)
47+
.withDayOfMonth(1);
48+
49+
if (!meetingStart.isBefore(targetMonth)) {
50+
targetMonth = targetMonth.plusYears(1);
51+
}
52+
53+
LocalDateTime deliveryDate = targetMonth.withHour(8);
54+
while (isWeekend(deliveryDate)) {
55+
deliveryDate = deliveryDate.plusDays(1);
56+
}
57+
58+
return deliveryDate;
59+
}
60+
61+
if (description.matches("Q\\d")) {
62+
int quarter = Integer.parseInt(description.substring(1));
63+
LocalDateTime lastDayOfQuarter = getLastDayOfQuarter(meetingStart, quarter);
64+
65+
if (!meetingStart.isBefore(lastDayOfQuarter.plusDays(1))) {
66+
lastDayOfQuarter = lastDayOfQuarter.plusYears(1);
67+
}
68+
69+
LocalDateTime deliveryDate = lastDayOfQuarter.withHour(8);
70+
while (isWeekend(deliveryDate)) {
71+
deliveryDate = deliveryDate.minusDays(1);
72+
}
73+
74+
return deliveryDate;
75+
}
76+
77+
throw new IllegalArgumentException("Invalid description");
78+
}
79+
80+
private static LocalDateTime toStartOfDay(LocalDateTime dateTime) {
81+
return dateTime.toLocalDate().atStartOfDay();
82+
}
83+
84+
private static LocalDateTime getLastDayOfQuarter(LocalDateTime dateTime, int quarter) {
85+
int lastMonthOfQuarter = quarter * 3;
86+
return toStartOfDay(dateTime)
87+
.withMonth(lastMonthOfQuarter)
88+
.withDayOfMonth(1)
89+
.plusMonths(1)
90+
.minusDays(1);
91+
}
92+
93+
private static boolean isWeekend(LocalDateTime date) {
94+
DayOfWeek dayOfWeek = date.getDayOfWeek();
95+
return dayOfWeek == SATURDAY || dayOfWeek == SUNDAY;
696
}
797
}

0 commit comments

Comments
 (0)