95 lines
2.4 KiB
ObjectPascal
95 lines
2.4 KiB
ObjectPascal
program Discordian_date;
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
uses
|
|
System.SysUtils,
|
|
System.DateUtils;
|
|
|
|
type
|
|
TDateTimeHelper = record helper for TDateTime
|
|
const
|
|
seasons: array of string = ['Chaos', 'Discord', 'Confusion', 'Bureaucracy',
|
|
'The Aftermath'];
|
|
weekday: array of string = ['Sweetmorn', 'Boomtime', 'Pungenday',
|
|
'Prickle-Prickle', 'Setting Orange'];
|
|
apostle: array of string = ['Mungday', 'Mojoday', 'Syaday', 'Zaraday', 'Maladay'];
|
|
holiday: array of string = ['Chaoflux', 'Discoflux', 'Confuflux',
|
|
'Bureflux', 'Afflux'];
|
|
function DiscordianDate(): string;
|
|
end;
|
|
|
|
{ TDateTimeHelper }
|
|
|
|
function TDateTimeHelper.DiscordianDate: string;
|
|
var
|
|
isLeapYear: boolean;
|
|
begin
|
|
isLeapYear := IsInLeapYear(self);
|
|
var dYear := (YearOf(self) + 1166).ToString;
|
|
if isLeapYear and (MonthOf(self) = 2) and (dayof(self) = 29) then
|
|
exit('St. Tib''s Day, in the YOLD ' + dYear);
|
|
|
|
var doy := DayOfTheYear(self);
|
|
if isLeapYear and (doy >= 60) then
|
|
doy := doy - 1;
|
|
|
|
var dsDay := doy mod 73;
|
|
|
|
if dsDay = 0 then
|
|
dsDay := 73;
|
|
|
|
if dsDay = 5 then
|
|
exit(apostle[doy div 73] + ', in the YOLD ' + dYear);
|
|
|
|
if dsDay = 50 then
|
|
exit(holiday[doy div 73] + ', in the YOLD ' + dYear);
|
|
|
|
var dSeas: string;
|
|
|
|
if (doy mod 73) = 0 then
|
|
dSeas := seasons[(doy - 1) div 73]
|
|
else
|
|
dSeas := seasons[doy div 73];
|
|
|
|
var dWday := weekday[(doy - 1) mod 5];
|
|
|
|
Result := format('%s, day %d of %s in the YOLD %s', [dWday, dsDay, dSeas, dYear]);
|
|
|
|
end;
|
|
|
|
procedure Test();
|
|
begin
|
|
Assert(EncodeDate(2010, 7, 22).DiscordianDate =
|
|
'Pungenday, day 57 of Confusion in the YOLD 3176');
|
|
Assert(EncodeDate(2012, 2, 28).DiscordianDate =
|
|
'Prickle-Prickle, day 59 of Chaos in the YOLD 3178');
|
|
Assert(EncodeDate(2012, 2, 29).DiscordianDate = 'St. Tib''s Day, in the YOLD 3178');
|
|
Assert(EncodeDate(2012, 3, 1).DiscordianDate =
|
|
'Setting Orange, day 60 of Chaos in the YOLD 3178');
|
|
Assert(EncodeDate(2010, 1, 5).DiscordianDate = 'Mungday, in the YOLD 3176');
|
|
Assert(EncodeDate(2011, 5, 3).DiscordianDate = 'Discoflux, in the YOLD 3177');
|
|
writeln('OK');
|
|
end;
|
|
|
|
var
|
|
dt: TDateTime;
|
|
i: Integer;
|
|
|
|
begin
|
|
if ParamCount = 0 then
|
|
begin
|
|
writeln(now.DiscordianDate);
|
|
readln;
|
|
halt;
|
|
end;
|
|
|
|
for i := 1 to ParamCount do
|
|
begin
|
|
if not TryStrToDate(ParamStr(i), dt) then
|
|
Continue;
|
|
writeln(dt.DiscordianDate);
|
|
end;
|
|
|
|
readln;
|
|
end.
|