line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#$Header: /home/cvs/date-discordian/lib/Date/Discordian.pm,v 1.36 2003/06/08 01:54:03 rbowen Exp $ |
2
|
|
|
|
|
|
|
package Date::Discordian; |
3
|
6
|
|
|
6
|
|
146449
|
use strict; |
|
6
|
|
|
|
|
19
|
|
|
6
|
|
|
|
|
339
|
|
4
|
6
|
|
|
6
|
|
31
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK @SEASONS @DAYS @HOLYDAYS); |
|
6
|
|
|
|
|
11
|
|
|
6
|
|
|
|
|
667
|
|
5
|
|
|
|
|
|
|
require Exporter; |
6
|
6
|
|
|
6
|
|
9587
|
use Time::Local; |
|
6
|
|
|
|
|
11552
|
|
|
6
|
|
|
|
|
354
|
|
7
|
6
|
|
|
6
|
|
4901
|
use Date::Leapyear qw(); |
|
6
|
|
|
|
|
1483
|
|
|
6
|
|
|
|
|
105
|
|
8
|
6
|
|
|
6
|
|
5845
|
use Date::ICal; |
|
6
|
|
|
|
|
88682
|
|
|
6
|
|
|
|
|
203
|
|
9
|
6
|
|
|
6
|
|
6380
|
use Memoize; |
|
6
|
|
|
|
|
18370
|
|
|
6
|
|
|
|
|
9001
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
@ISA = qw(Exporter Date::ICal); |
12
|
|
|
|
|
|
|
@EXPORT = qw( discordian inverse_discordian ); |
13
|
|
|
|
|
|
|
@EXPORT_OK = qw( @SEASONS @DAYS ); |
14
|
|
|
|
|
|
|
$VERSION = (qw'$Revision: 1.36 $')[1]; |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
@SEASONS = qw(Chaos Discord Confusion Bureaucracy Aftermath); |
17
|
|
|
|
|
|
|
@DAYS = |
18
|
|
|
|
|
|
|
( 'Sweetmorn', 'Boomtime', 'Pungenday', 'Prickle Prickle', 'Setting Orange' ); |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
@HOLYDAYS = ( |
21
|
|
|
|
|
|
|
[ 'Mungoday', 'Chaoflux' ], [ 'Mojoday', 'Discoflux' ], |
22
|
|
|
|
|
|
|
[ 'Syaday', 'Confuflux' ], [ 'Zaraday', 'Bureflux' ], |
23
|
|
|
|
|
|
|
[ 'Maladay', 'Afflux' ], |
24
|
|
|
|
|
|
|
); |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# sub new {{{ |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
sub new { # There is nothing new under the sun. |
29
|
17
|
|
|
17
|
1
|
83
|
my $class = shift; |
30
|
17
|
|
|
|
|
59
|
my %args = @_; |
31
|
17
|
|
|
|
|
25
|
my $self; |
32
|
|
|
|
|
|
|
|
33
|
17
|
100
|
|
|
|
52
|
$args{discordian} = $args{disco} if defined $args{disco}; |
34
|
17
|
50
|
|
|
|
41
|
$args{epoch} = $args{EPOCH} if defined $args{EPOCH}; |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# Discordian date? |
37
|
17
|
100
|
|
|
|
39
|
if ( $args{discordian} ) { |
38
|
|
|
|
|
|
|
|
39
|
1
|
|
|
|
|
5
|
$self = $class->SUPER::new( |
40
|
|
|
|
|
|
|
epoch => from_discordian( $args{discordian} ) ); |
41
|
|
|
|
|
|
|
} else { |
42
|
|
|
|
|
|
|
|
43
|
16
|
|
|
|
|
99
|
$self = $class->SUPER::new(%args); |
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
17
|
|
|
|
|
1248
|
bless $self, $class; |
47
|
17
|
|
|
|
|
54
|
return $self; |
48
|
|
|
|
|
|
|
} #}}} |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
# sub discordian {{{ |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub discordian { # Not to be confused with sub genius. |
53
|
22
|
100
|
|
22
|
0
|
191
|
if ( ref $_[0] ) { |
54
|
17
|
|
|
|
|
25
|
my $self = shift; |
55
|
17
|
|
|
|
|
56
|
my $d = discohash( $self->year, $self->month, $self->day ); |
56
|
17
|
|
|
|
|
249
|
return $d->{disco}; |
57
|
|
|
|
|
|
|
} else { |
58
|
5
|
|
|
|
|
17
|
return to_discordian( $_[0] ); |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
# Fnord! |
61
|
|
|
|
|
|
|
} #}}} |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
# sub to_discordian {{{ |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub to_discordian { # Be careful. It's hard to get back. |
66
|
5
|
|
|
5
|
0
|
7
|
my $datetime = shift; |
67
|
5
|
100
|
|
|
|
15
|
$datetime = time unless defined $datetime; |
68
|
5
|
|
|
|
|
26
|
my $d = Date::ICal->new( epoch => $datetime ); |
69
|
|
|
|
|
|
|
|
70
|
5
|
|
|
|
|
193
|
my $discohash = discohash( $d->year, $d->month, $d->day ); |
71
|
5
|
|
|
|
|
190
|
return $discohash->{disco}; |
72
|
|
|
|
|
|
|
} |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
memoize('discohash'); |
75
|
|
|
|
|
|
|
sub discohash { # Is that something you smoke at a disco? |
76
|
|
|
|
|
|
|
my ( $year, $month, $d ) = @_; |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
# my $datetime = shift; |
79
|
|
|
|
|
|
|
my ( $season, $day, $dow, $yold, $holyday, $datestring ); |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
my $yday = Date::ICal::days_this_year( $d, $month, $year ) + 1; |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
# It *says* it's an internal method, but I'm not buying it. |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
if ( Date::Leapyear::isleap($year) ) { |
86
|
|
|
|
|
|
|
if ( $yday <= 59 ) { |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
# nothing changes |
89
|
|
|
|
|
|
|
} elsif ( $yday == 60 ) |
90
|
|
|
|
|
|
|
{ |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
# leap day! |
93
|
|
|
|
|
|
|
$datestring = "St. Tibb's Day"; |
94
|
|
|
|
|
|
|
} else { |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
# The rest of the year after leap day |
97
|
|
|
|
|
|
|
$yday--; |
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
} # End leap year stuff |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
$season = int( ( $yday - 1 ) / 73 ); |
102
|
|
|
|
|
|
|
$day = ( $yday % 73 ) || 73; |
103
|
|
|
|
|
|
|
$dow = $yday % 5; |
104
|
|
|
|
|
|
|
$yold = $year + 1166; |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
if ( $day == 5 ) { $holyday = $HOLYDAYS[$season][0]; } |
107
|
|
|
|
|
|
|
elsif ( $day == 50 ) { $holyday = $HOLYDAYS[$season][1]; } |
108
|
|
|
|
|
|
|
else { $holyday = undef; } |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
unless ($datestring) { |
111
|
|
|
|
|
|
|
if ($holyday) { |
112
|
|
|
|
|
|
|
$datestring = |
113
|
|
|
|
|
|
|
$DAYS[ $dow - 1 ] . ' (' . $holyday . '), ' . $SEASONS[$season] |
114
|
|
|
|
|
|
|
. ' ' . $day; |
115
|
|
|
|
|
|
|
} else { |
116
|
|
|
|
|
|
|
$datestring = |
117
|
|
|
|
|
|
|
$DAYS[ $dow - 1 ] . ', ' . $SEASONS[$season] . ' ' . $day; |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
$datestring .= " YOLD $yold"; |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
my $discohash = { |
124
|
|
|
|
|
|
|
disco => $datestring, |
125
|
|
|
|
|
|
|
season => $SEASONS[$season], |
126
|
|
|
|
|
|
|
yold => $yold, |
127
|
|
|
|
|
|
|
holyday => $holyday, |
128
|
|
|
|
|
|
|
seasonday => $day, |
129
|
|
|
|
|
|
|
discoday => $DAYS[ $dow - 1 ], |
130
|
|
|
|
|
|
|
}; |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
return $discohash; |
133
|
|
|
|
|
|
|
} #}}} |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
# sub inverse_discordian {{{ |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
sub inverse_discordian { # Sounds like a wrestling hold. |
138
|
4
|
50
|
|
4
|
0
|
15
|
if ( ref $_[0] ) { |
139
|
0
|
|
|
|
|
0
|
my $self = shift; |
140
|
0
|
|
|
|
|
0
|
return $self->epoch; |
141
|
|
|
|
|
|
|
} else { |
142
|
4
|
|
|
|
|
12
|
return from_discordian( $_[0] ); |
143
|
|
|
|
|
|
|
} |
144
|
|
|
|
|
|
|
} #}}} |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
# sub from_discordian {{{ |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
sub from_discordian { # You only think it's possible. |
149
|
5
|
|
|
5
|
0
|
10
|
my $discordian = shift; |
150
|
5
|
|
|
|
|
5
|
my $epoch; |
151
|
|
|
|
|
|
|
|
152
|
5
|
|
|
|
|
10
|
for ($discordian) { |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
# The day does not really matter ... |
155
|
5
|
|
|
|
|
54
|
s/sweetmorn|boomtime|setting orange|prickle prickle|pungenday//i; |
156
|
5
|
|
|
|
|
19
|
s/,//g; |
157
|
5
|
|
|
|
|
19
|
s/YOLD//i; |
158
|
5
|
|
|
|
|
27
|
s/\s+/ /g; |
159
|
5
|
|
|
|
|
12
|
s/\(.*?\)//; # Holydays |
160
|
5
|
|
|
|
|
20
|
s/^\s+//; |
161
|
|
|
|
|
|
|
} |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
# Special case - St. Tibb's Day |
164
|
5
|
100
|
|
|
|
19
|
if ( $discordian =~ /st\.? tibb'?s day/i ) { |
165
|
1
|
|
|
|
|
3
|
$discordian =~ m/(\d{4})/; |
166
|
1
|
|
|
|
|
3
|
my $year = $1; |
167
|
1
|
|
|
|
|
3
|
$year -= 1166; |
168
|
1
|
|
|
|
|
3
|
$epoch = timegm( 0, 0, 0, 29, 1, $year ); |
169
|
|
|
|
|
|
|
} else { |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
# With any luck, we now have "season day year" |
172
|
4
|
|
|
|
|
18
|
my ( $season, $day, $year ) = split / /, $discordian; |
173
|
4
|
|
|
|
|
11
|
$year -= 1166; |
174
|
4
|
|
|
|
|
9
|
$season = lc($season); |
175
|
4
|
|
|
|
|
19
|
my %seasons = ( |
176
|
|
|
|
|
|
|
chaos => 0, |
177
|
|
|
|
|
|
|
discord => 1, |
178
|
|
|
|
|
|
|
confusion => 2, |
179
|
|
|
|
|
|
|
bureaucracy => 3, |
180
|
|
|
|
|
|
|
aftermath => 4 |
181
|
|
|
|
|
|
|
); |
182
|
4
|
|
|
|
|
13
|
my $doy = $seasons{$season} * 73 + $day; |
183
|
4
|
100
|
66
|
|
|
21
|
$doy++ if ( $doy >= 60 && Date::Leapyear::isleap($year) ); |
184
|
4
|
|
|
|
|
26
|
$epoch = ( $doy - 1 ) * 86400 + timegm( 0, 0, 0, 1, 0, $year ); |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
|
187
|
5
|
|
|
|
|
175
|
return $epoch; |
188
|
|
|
|
|
|
|
} #}}} |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
# sub season {{{ |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
sub season { # For everything, there is a season. |
193
|
2
|
|
|
2
|
0
|
4
|
my $d = shift; |
194
|
2
|
|
|
|
|
3
|
my $h; |
195
|
|
|
|
|
|
|
|
196
|
2
|
50
|
|
|
|
6
|
if ( ref $d ) { |
197
|
2
|
|
|
|
|
8
|
$h = discohash( $d->year, $d->month, $d->day ); |
198
|
|
|
|
|
|
|
} else { |
199
|
0
|
|
|
|
|
0
|
$h = to_discordian($d); |
200
|
|
|
|
|
|
|
} |
201
|
2
|
|
|
|
|
179
|
return $h->{season}; # turn, turn, turn |
202
|
|
|
|
|
|
|
} #}}} |
203
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
# sub discoday {{{ |
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
sub discoday { # Stayin' alive |
207
|
2
|
|
|
2
|
0
|
1062
|
my $d = shift; |
208
|
2
|
|
|
|
|
3
|
my $h; |
209
|
|
|
|
|
|
|
|
210
|
2
|
50
|
|
|
|
6
|
if ( ref $d ) { |
211
|
2
|
|
|
|
|
26
|
$h = discohash( $d->year, $d->month, $d->day ); |
212
|
2
|
|
|
|
|
105
|
return $h->{discoday}; |
213
|
|
|
|
|
|
|
} else { |
214
|
0
|
|
|
|
|
0
|
$h = to_discordian($d); |
215
|
0
|
|
|
|
|
0
|
return $h->{discoday}; |
216
|
|
|
|
|
|
|
} |
217
|
|
|
|
|
|
|
} # }}} |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
# sub yold {{{ |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
sub yold { |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
# Some folks say the epoch begins in 4000 BC. This is heresy. Spurn |
224
|
|
|
|
|
|
|
# these people. Or at least make strange chicken noises at them. |
225
|
|
|
|
|
|
|
|
226
|
2
|
|
|
2
|
0
|
5
|
my $d = shift; |
227
|
2
|
|
|
|
|
4
|
my $h; |
228
|
|
|
|
|
|
|
|
229
|
2
|
50
|
|
|
|
8
|
if ( ref $d ) { |
230
|
2
|
|
|
|
|
6
|
$h = discohash( $d->year, $d->month, $d->day ); |
231
|
2
|
|
|
|
|
178
|
return $h->{yold}; |
232
|
|
|
|
|
|
|
} else { |
233
|
0
|
|
|
|
|
|
$h = to_discordian($d); |
234
|
0
|
|
|
|
|
|
return $h->{yold}; |
235
|
|
|
|
|
|
|
} |
236
|
|
|
|
|
|
|
} #}}} |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
# sub holyday {{{ |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
sub holyday { # Eat a hot dog |
241
|
0
|
|
|
0
|
0
|
|
my $d = shift; |
242
|
0
|
|
|
|
|
|
my $h; |
243
|
|
|
|
|
|
|
|
244
|
0
|
0
|
|
|
|
|
if ( ref $d ) { |
245
|
0
|
|
|
|
|
|
$h = discohash( $d->year, $d->month, $d->day ); |
246
|
0
|
|
|
|
|
|
return $h->{holyday}; |
247
|
|
|
|
|
|
|
} else { |
248
|
0
|
|
|
|
|
|
$h = to_discordian($d); |
249
|
0
|
|
|
|
|
|
return $h->{holyday}; |
250
|
|
|
|
|
|
|
} |
251
|
|
|
|
|
|
|
} #}}} |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
'Hail Eris!'; |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
# Docs {{{ |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=head1 NAME |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
Date::Discordian - Calculate the Discordian date of a particular day |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
=head1 SYNOPSIS |
262
|
|
|
|
|
|
|
|
263
|
|
|
|
|
|
|
use Date::Discordian; |
264
|
|
|
|
|
|
|
$discordian = discordian(time); |
265
|
|
|
|
|
|
|
$epochtime = inverse_discordian('bureaucracy 47, 3166'); |
266
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
Or, the OO interface ... |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
use Date::Discordian; |
270
|
|
|
|
|
|
|
my $disco = Date::Discordian->new( epoch => time ); |
271
|
|
|
|
|
|
|
$discordian = $disco->discordian; |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
my $date = Date::Discordian->new( |
274
|
|
|
|
|
|
|
discordian => 'bureaucracy 47, 3166'); |
275
|
|
|
|
|
|
|
$epoch = $date->epoch; |
276
|
|
|
|
|
|
|
$ical = $date->ical; |
277
|
|
|
|
|
|
|
$discordian = $date->discordian; |
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
$season = $date->season; |
280
|
|
|
|
|
|
|
$discoday = $date->discoday; # eg 'Pungenday' |
281
|
|
|
|
|
|
|
$yold = $date->yold; |
282
|
|
|
|
|
|
|
$holyday = $date->holyday; |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
Or, for dates outside of the epoch: |
285
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
my $disco = Date::Discordian->new( ical => '17760704Z' ); |
287
|
|
|
|
|
|
|
$discordian = $disco->discordian; |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
Note that a Date::Discordian object ISA Date::ICal object, so see the |
290
|
|
|
|
|
|
|
docs for Date::ICal as well. |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
=head1 DESCRIPTION |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
Calculate the Discordian date of a particular 'real' date. |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
Date::Discordian exports two functions - discordian(), and |
297
|
|
|
|
|
|
|
inverse_discordian. C, |
298
|
|
|
|
|
|
|
when given a time value, returns a string, giving the Discordian |
299
|
|
|
|
|
|
|
date for the given day. I, given a |
300
|
|
|
|
|
|
|
Discordian date in the same format that C emits, |
301
|
|
|
|
|
|
|
returns an epoch time value. It is pretty picky about time |
302
|
|
|
|
|
|
|
format. Pity. |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
I'm really not sure how this would ever be used, so if you actually use |
305
|
|
|
|
|
|
|
this, send me a note. |
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
=head1 Bugs/To Do |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
There are no bugs. Only misinterpretation of the documentation. |
310
|
|
|
|
|
|
|
Accept C-style input. And possibly output the same format as |
311
|
|
|
|
|
|
|
ddate, since that seems more widely accepted |
312
|
|
|
|
|
|
|
Perhaps an option of some variety to be able to create dates to use |
313
|
|
|
|
|
|
|
the 4000bc epoch rather than the 1166bc epoch |
314
|
|
|
|
|
|
|
Get mentioned in more articles about the cool things you can do with |
315
|
|
|
|
|
|
|
Perl (http://www.perl.com/pub/a/2001/10/31/lighter.html) |
316
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
=head1 General comments |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
When I first started working on this module, it was purely as an |
320
|
|
|
|
|
|
|
exercise to get started on Date:: modules in general. Since that time, I |
321
|
|
|
|
|
|
|
have become alarmingly aware of how the events of real life seem to |
322
|
|
|
|
|
|
|
follow the Discordian calendrical rhythm. Perhaps this is just because |
323
|
|
|
|
|
|
|
everything sucks all of the time, but it seems to be a little deeper |
324
|
|
|
|
|
|
|
than this. |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
You can find out more about the Discordian Calendar at |
327
|
|
|
|
|
|
|
http://jubal.westnet.com/hyperdiscordia/discordian_calendar.html |
328
|
|
|
|
|
|
|
and at a plethora of other sites on the Internet. |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
It is related to the Principia Discordia |
331
|
|
|
|
|
|
|
(http://members.xoom.com/ffungo/titlepage.html) |
332
|
|
|
|
|
|
|
and the "religion" of Discordianism. I suppose that there are people |
333
|
|
|
|
|
|
|
that actually take this sort of thing seriously. But then, there are |
334
|
|
|
|
|
|
|
people that collect Beanie Babies, so what do you expect? |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
=head1 AUTHOR |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
Rich Bowen (DrBacchus) |
339
|
|
|
|
|
|
|
-- (doubter of the wisdom of Discordianism) |
340
|
|
|
|
|
|
|
Matt Cashner |
341
|
|
|
|
|
|
|
-- (Sungo the Funky) |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=head1 SEE ALSO |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
Date::ICal |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
Reefknot (www.reefknot.org) |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
datetime@perl.org (http://lists.perl.org/showlist.cgi?name=datetime) |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
Calendrical Calculations, by Reingold and Dershowitz. Not that it has |
352
|
|
|
|
|
|
|
anything to do with this calendar, but it is a great resource if you are |
353
|
|
|
|
|
|
|
interested in algorithmic calendars. And, on that same note, the Oxford |
354
|
|
|
|
|
|
|
Companion to the Year is a wonderful book too. |
355
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
=cut |
357
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
#}}} |
359
|
|
|
|
|
|
|
|