For full ranges
There is the function DayRange
that can be used for this purpose, but not in the same simple way like CharacterRange
.
For the days:
DayName /@ DayRange[Today, Today ~DatePlus~ {{1, "Week"}, {-1, "Day"}}]
{Wednesday, Thursday, Friday, Saturday, Sunday, Monday, Tuesday}
For the months:
DateValue[#, "MonthName"] & /@ DayRange[Today, Today ~DatePlus~ {1, "Year"}] // DeleteDuplicates
{"August", "September", "October", "November", "December", "January", "February", "March", "April", "May", "June", "July"}
If you need a special order, Today
can be replaced with a suitable DateObject
.
Or shorter and faster for the month range:
Day Range:
DayName[DateObject[{2014, 09, #}]] & /@ Range[7]
{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}
Month Range:
(DateValue[#, "MonthName"] &@DateObject[{2014, #, 01}]) & /@ Range[12]
{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
For arbitrary ranges
For arbitrary month ranges:
monthRange[month1_String, month2_String] :=
Module[{m1 = DateList[month1][[;; 2]], m2 = DateList[month2][[;; 2]], i},
Reap@For[i = 0,
DateValue[m1 + i, "MonthName"] != DateValue[m2, "MonthName"],
i++,
Sow@DateValue[m1 + i, "MonthName"]
] // Last // Flatten // Append[month2]
]
For arbitrary day ranges:
dayRange[day1_String, day2_String] :=
Module[{date1 = (DateList@DayPlus[Today, 1, Symbol[day1]])[[;; 3]], day2Symbol = Symbol[day2], i},
Reap@For[i = 0,
DayName@(date1 + {0, 0, i}) != day2Symbol,
i++,
Sow@ToString@DayName@(date1 + {0, 0, i})
] // Last // Flatten // Append[day2]
]
and the function overload for symbolic days
dayRange[day1_Symbol, day2_Symbol] :=
Module[{date1 = (DateList@DayPlus[Today, 1, day1])[[;; 3]], i},
Reap@For[i = 0,
DayName@(date1 + {0, 0, i}) != day2,
i++,
Sow@DayName@(date1 + {0, 0, i})
] // Last // Flatten // Append[day2]
]
And for those who can't stand procedual programming
monthRange2[month1_String, month2_String] :=
Module[{d1 = DateList[month1][[2]], d2 = DateList[month2][[2]], range},
range = If[d2 < d1, Range[d1, 12 + d2], Range[d1, d2]];
(DateValue[#, "MonthName"] & @ DateObject[{2014, #, 01}]) & /@ range
]
and
dayRange2[day1_String, day2_String] :=
Module[{date1 = DayPlus[Today, 1, Symbol@day1], date2},
date2 = DayPlus[date1 ~DayPlus~ -1, 1, Symbol@day2];
ToString@*DayName /@ date1 ~DayRange~ date2
]
with the overload
dayRange2[day1_Symbol, day2_Symbol] :=
Module[{date1 = DayPlus[Today, 1, day1], date2},
date2 = DayPlus[date1 ~DayPlus~ -1, 1, day2];
DayName /@ date1 ~DayRange~ date2
]