49 lines
2.4 KiB
AppleScript
49 lines
2.4 KiB
AppleScript
on gregorianToDiscordian(inputDate) -- Input: AppleScript date object.
|
|
(*
|
|
Discordian years are aligned with, and the same length as, Gregorian years.
|
|
Each has 73 5-day weeks and 5 73-day seasons. (73 * 5 = 365.)
|
|
The first day of a Discordian year is also that of its first week and first season.
|
|
In leap years, an extra day called "St. Tib's Day", is inserted between days 59 and 60.
|
|
It's considered to be outside the calendar, so the day after it is Setting Orange, Chaos 60,
|
|
not Sweetmorn, Chaos 61. Year 1 YOLD is 1166 BC, but this handler takes an AS date object
|
|
as its input and is only good for AD Gregorian dates. Since the Discordian calendar's an
|
|
American invention, the output here's in the US style: "Weekday, Season day, year".
|
|
*)
|
|
-- Calculate the input date's day-of-year number.
|
|
copy inputDate to startOfYear
|
|
tell startOfYear to set {its day, its month} to {1, January}
|
|
set dayOfYear to (inputDate - startOfYear) div days + 1
|
|
|
|
-- If it's a leap year, special-case St. Tib's Day, or adjust the day-of-year number if the day comes after that.
|
|
set y to inputDate's year
|
|
if ((y mod 4 is 0) and ((y mod 100 > 0) or (y mod 400 is 0))) then
|
|
if (dayOfYear is 60) then
|
|
set dayOfYear to "St. Tib's Day"
|
|
else if (dayOfYear > 60) then
|
|
set dayOfYear to dayOfYear - 1
|
|
end if
|
|
end if
|
|
|
|
-- Start the output text with either "St. Tib's Day" or the weekday, season, and day-of-season number.
|
|
if (dayOfYear is "St. Tib's Day") then
|
|
set outputText to dayOfYear
|
|
else
|
|
tell dayOfYear - 1
|
|
set dayOfWeek to it mod 5 + 1
|
|
set seasonNumber to it div 73 + 1
|
|
set dayOfSeason to it mod 73 + 1
|
|
end tell
|
|
set theWeekdays to {"Sweetmorn", "Boomtime", "Pungenday", "Prickle-Prickle", "Setting Orange"}
|
|
set theSeasons to {"Chaos ", "Discord ", "Confusion ", "Bureaucracy ", "The Aftermath "}
|
|
set outputText to (item dayOfWeek of theWeekdays) & ", " & (item seasonNumber of theSeasons) & dayOfSeason
|
|
end if
|
|
|
|
-- Append the Discordian year number and return the result.
|
|
return outputText & ", " & (y + 1166)
|
|
end gregorianToDiscordian
|
|
|
|
set ASDate to (current date)
|
|
set gregorianDate to ASDate's date string
|
|
set discordianDate to gregorianToDiscordian(ASDate)
|
|
return {Gregorian:gregorianDate, Discordian:discordianDate}
|