Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
dcd038ff
Kaydet (Commit)
dcd038ff
authored
Eyl 14, 1998
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
nannified.
üst
a0f0a33d
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
70 additions
and
70 deletions
+70
-70
Dates.py
Demo/classes/Dates.py
+70
-70
No files found.
Demo/classes/Dates.py
Dosyayı görüntüle @
dcd038ff
...
@@ -39,11 +39,11 @@
...
@@ -39,11 +39,11 @@
# vi:set tabsize=8:
# vi:set tabsize=8:
_MONTH_NAMES
=
[
'January'
,
'February'
,
'March'
,
'April'
,
'May'
,
_MONTH_NAMES
=
[
'January'
,
'February'
,
'March'
,
'April'
,
'May'
,
'June'
,
'July'
,
'August'
,
'September'
,
'October'
,
'June'
,
'July'
,
'August'
,
'September'
,
'October'
,
'November'
,
'December'
]
'November'
,
'December'
]
_DAY_NAMES
=
[
'Friday'
,
'Saturday'
,
'Sunday'
,
'Monday'
,
_DAY_NAMES
=
[
'Friday'
,
'Saturday'
,
'Sunday'
,
'Monday'
,
'Tuesday'
,
'Wednesday'
,
'Thursday'
]
'Tuesday'
,
'Wednesday'
,
'Thursday'
]
_DAYS_IN_MONTH
=
[
31
,
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
]
_DAYS_IN_MONTH
=
[
31
,
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
]
...
@@ -56,114 +56,114 @@ del dbm, dim
...
@@ -56,114 +56,114 @@ del dbm, dim
_INT_TYPES
=
type
(
1
),
type
(
1L
)
_INT_TYPES
=
type
(
1
),
type
(
1L
)
def
_is_leap
(
year
):
# 1 if leap year, else 0
def
_is_leap
(
year
):
# 1 if leap year, else 0
if
year
%
4
!=
0
:
return
0
if
year
%
4
!=
0
:
return
0
if
year
%
400
==
0
:
return
1
if
year
%
400
==
0
:
return
1
return
year
%
100
!=
0
return
year
%
100
!=
0
def
_days_in_year
(
year
):
# number of days in year
def
_days_in_year
(
year
):
# number of days in year
return
365
+
_is_leap
(
year
)
return
365
+
_is_leap
(
year
)
def
_days_before_year
(
year
):
# number of days before year
def
_days_before_year
(
year
):
# number of days before year
return
year
*
365L
+
(
year
+
3
)
/
4
-
(
year
+
99
)
/
100
+
(
year
+
399
)
/
400
return
year
*
365L
+
(
year
+
3
)
/
4
-
(
year
+
99
)
/
100
+
(
year
+
399
)
/
400
def
_days_in_month
(
month
,
year
):
# number of days in month of year
def
_days_in_month
(
month
,
year
):
# number of days in month of year
if
month
==
2
and
_is_leap
(
year
):
return
29
if
month
==
2
and
_is_leap
(
year
):
return
29
return
_DAYS_IN_MONTH
[
month
-
1
]
return
_DAYS_IN_MONTH
[
month
-
1
]
def
_days_before_month
(
month
,
year
):
# number of days in year before month
def
_days_before_month
(
month
,
year
):
# number of days in year before month
return
_DAYS_BEFORE_MONTH
[
month
-
1
]
+
(
month
>
2
and
_is_leap
(
year
))
return
_DAYS_BEFORE_MONTH
[
month
-
1
]
+
(
month
>
2
and
_is_leap
(
year
))
def
_date2num
(
date
):
# compute ordinal of date.month,day,year
def
_date2num
(
date
):
# compute ordinal of date.month,day,year
return
_days_before_year
(
date
.
year
)
+
\
return
_days_before_year
(
date
.
year
)
+
\
_days_before_month
(
date
.
month
,
date
.
year
)
+
\
_days_before_month
(
date
.
month
,
date
.
year
)
+
\
date
.
day
date
.
day
_DI400Y
=
_days_before_year
(
400
)
# number of days in 400 years
_DI400Y
=
_days_before_year
(
400
)
# number of days in 400 years
def
_num2date
(
n
):
# return date with ordinal n
def
_num2date
(
n
):
# return date with ordinal n
if
type
(
n
)
not
in
_INT_TYPES
:
if
type
(
n
)
not
in
_INT_TYPES
:
raise
TypeError
,
'argument must be integer: '
+
`type(n)`
raise
TypeError
,
'argument must be integer: '
+
`type(n)`
ans
=
Date
(
1
,
1
,
1
)
# arguments irrelevant; just getting a Date obj
ans
=
Date
(
1
,
1
,
1
)
# arguments irrelevant; just getting a Date obj
del
ans
.
ord
,
ans
.
month
,
ans
.
day
,
ans
.
year
# un-initialize it
del
ans
.
ord
,
ans
.
month
,
ans
.
day
,
ans
.
year
# un-initialize it
ans
.
ord
=
n
ans
.
ord
=
n
n400
=
(
n
-
1
)
/
_DI400Y
# # of 400-year blocks preceding
n400
=
(
n
-
1
)
/
_DI400Y
# # of 400-year blocks preceding
year
,
n
=
400
*
n400
,
n
-
_DI400Y
*
n400
year
,
n
=
400
*
n400
,
n
-
_DI400Y
*
n400
more
=
n
/
365
more
=
n
/
365
dby
=
_days_before_year
(
more
)
dby
=
_days_before_year
(
more
)
if
dby
>=
n
:
if
dby
>=
n
:
more
=
more
-
1
more
=
more
-
1
dby
=
dby
-
_days_in_year
(
more
)
dby
=
dby
-
_days_in_year
(
more
)
year
,
n
=
year
+
more
,
int
(
n
-
dby
)
year
,
n
=
year
+
more
,
int
(
n
-
dby
)
try
:
year
=
int
(
year
)
# chop to int, if it fits
try
:
year
=
int
(
year
)
# chop to int, if it fits
except
(
ValueError
,
OverflowError
):
pass
except
(
ValueError
,
OverflowError
):
pass
month
=
min
(
n
/
29
+
1
,
12
)
month
=
min
(
n
/
29
+
1
,
12
)
dbm
=
_days_before_month
(
month
,
year
)
dbm
=
_days_before_month
(
month
,
year
)
if
dbm
>=
n
:
if
dbm
>=
n
:
month
=
month
-
1
month
=
month
-
1
dbm
=
dbm
-
_days_in_month
(
month
,
year
)
dbm
=
dbm
-
_days_in_month
(
month
,
year
)
ans
.
month
,
ans
.
day
,
ans
.
year
=
month
,
n
-
dbm
,
year
ans
.
month
,
ans
.
day
,
ans
.
year
=
month
,
n
-
dbm
,
year
return
ans
return
ans
def
_num2day
(
n
):
# return weekday name of day with ordinal n
def
_num2day
(
n
):
# return weekday name of day with ordinal n
return
_DAY_NAMES
[
int
(
n
%
7
)
]
return
_DAY_NAMES
[
int
(
n
%
7
)
]
class
Date
:
class
Date
:
def
__init__
(
self
,
month
,
day
,
year
):
def
__init__
(
self
,
month
,
day
,
year
):
if
not
1
<=
month
<=
12
:
if
not
1
<=
month
<=
12
:
raise
ValueError
,
'month must be in 1..12: '
+
`month`
raise
ValueError
,
'month must be in 1..12: '
+
`month`
dim
=
_days_in_month
(
month
,
year
)
dim
=
_days_in_month
(
month
,
year
)
if
not
1
<=
day
<=
dim
:
if
not
1
<=
day
<=
dim
:
raise
ValueError
,
'day must be in 1..'
+
`dim`
+
': '
+
`day`
raise
ValueError
,
'day must be in 1..'
+
`dim`
+
': '
+
`day`
self
.
month
,
self
.
day
,
self
.
year
=
month
,
day
,
year
self
.
month
,
self
.
day
,
self
.
year
=
month
,
day
,
year
self
.
ord
=
_date2num
(
self
)
self
.
ord
=
_date2num
(
self
)
# don't allow setting existing attributes
# don't allow setting existing attributes
def
__setattr__
(
self
,
name
,
value
):
def
__setattr__
(
self
,
name
,
value
):
if
self
.
__dict__
.
has_key
(
name
):
if
self
.
__dict__
.
has_key
(
name
):
raise
AttributeError
,
'read-only attribute '
+
name
raise
AttributeError
,
'read-only attribute '
+
name
self
.
__dict__
[
name
]
=
value
self
.
__dict__
[
name
]
=
value
def
__cmp__
(
self
,
other
):
def
__cmp__
(
self
,
other
):
return
cmp
(
self
.
ord
,
other
.
ord
)
return
cmp
(
self
.
ord
,
other
.
ord
)
# define a hash function so dates can be used as dictionary keys
# define a hash function so dates can be used as dictionary keys
def
__hash__
(
self
):
def
__hash__
(
self
):
return
hash
(
self
.
ord
)
return
hash
(
self
.
ord
)
# print as, e.g., Mon 16 Aug 1993
# print as, e.g., Mon 16 Aug 1993
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'
%.3
s
%2
d
%.3
s '
%
(
return
'
%.3
s
%2
d
%.3
s '
%
(
self
.
weekday
(),
self
.
weekday
(),
self
.
day
,
self
.
day
,
_MONTH_NAMES
[
self
.
month
-
1
]
)
+
`self.year`
_MONTH_NAMES
[
self
.
month
-
1
]
)
+
`self.year`
# Python 1.1 coerces neither int+date nor date+int
# Python 1.1 coerces neither int+date nor date+int
def
__add__
(
self
,
n
):
def
__add__
(
self
,
n
):
if
type
(
n
)
not
in
_INT_TYPES
:
if
type
(
n
)
not
in
_INT_TYPES
:
raise
TypeError
,
'can
\'
t add '
+
`type(n)`
+
' to date'
raise
TypeError
,
'can
\'
t add '
+
`type(n)`
+
' to date'
return
_num2date
(
self
.
ord
+
n
)
return
_num2date
(
self
.
ord
+
n
)
__radd__
=
__add__
# handle int+date
__radd__
=
__add__
# handle int+date
# Python 1.1 coerces neither date-int nor date-date
# Python 1.1 coerces neither date-int nor date-date
def
__sub__
(
self
,
other
):
def
__sub__
(
self
,
other
):
if
type
(
other
)
in
_INT_TYPES
:
# date-int
if
type
(
other
)
in
_INT_TYPES
:
# date-int
return
_num2date
(
self
.
ord
-
other
)
return
_num2date
(
self
.
ord
-
other
)
else
:
else
:
return
self
.
ord
-
other
.
ord
# date-date
return
self
.
ord
-
other
.
ord
# date-date
# complain about int-date
# complain about int-date
def
__rsub__
(
self
,
other
):
def
__rsub__
(
self
,
other
):
raise
TypeError
,
'Can
\'
t subtract date from integer'
raise
TypeError
,
'Can
\'
t subtract date from integer'
def
weekday
(
self
):
def
weekday
(
self
):
return
_num2day
(
self
.
ord
)
return
_num2day
(
self
.
ord
)
def
today
():
def
today
():
import
time
import
time
...
@@ -175,30 +175,30 @@ def test( firstyear, lastyear ):
...
@@ -175,30 +175,30 @@ def test( firstyear, lastyear ):
a
=
Date
(
9
,
30
,
1913
)
a
=
Date
(
9
,
30
,
1913
)
b
=
Date
(
9
,
30
,
1914
)
b
=
Date
(
9
,
30
,
1914
)
if
`a`
!=
'Tue 30 Sep 1913'
:
if
`a`
!=
'Tue 30 Sep 1913'
:
raise
DateTestError
,
'__repr__ failure'
raise
DateTestError
,
'__repr__ failure'
if
(
not
a
<
b
)
or
a
==
b
or
a
>
b
or
b
!=
b
:
if
(
not
a
<
b
)
or
a
==
b
or
a
>
b
or
b
!=
b
:
raise
DateTestError
,
'__cmp__ failure'
raise
DateTestError
,
'__cmp__ failure'
if
a
+
365
!=
b
or
365
+
a
!=
b
:
if
a
+
365
!=
b
or
365
+
a
!=
b
:
raise
DateTestError
,
'__add__ failure'
raise
DateTestError
,
'__add__ failure'
if
b
-
a
!=
365
or
b
-
365
!=
a
:
if
b
-
a
!=
365
or
b
-
365
!=
a
:
raise
DateTestError
,
'__sub__ failure'
raise
DateTestError
,
'__sub__ failure'
try
:
try
:
x
=
1
-
a
x
=
1
-
a
raise
DateTestError
,
'int-date should have failed'
raise
DateTestError
,
'int-date should have failed'
except
TypeError
:
except
TypeError
:
pass
pass
try
:
try
:
x
=
a
+
b
x
=
a
+
b
raise
DateTestError
,
'date+date should have failed'
raise
DateTestError
,
'date+date should have failed'
except
TypeError
:
except
TypeError
:
pass
pass
if
a
.
weekday
()
!=
'Tuesday'
:
if
a
.
weekday
()
!=
'Tuesday'
:
raise
DateTestError
,
'weekday() failure'
raise
DateTestError
,
'weekday() failure'
if
max
(
a
,
b
)
is
not
b
or
min
(
a
,
b
)
is
not
a
:
if
max
(
a
,
b
)
is
not
b
or
min
(
a
,
b
)
is
not
a
:
raise
DateTestError
,
'min/max failure'
raise
DateTestError
,
'min/max failure'
d
=
{
a
-
1
:
b
,
b
:
a
+
1
}
d
=
{
a
-
1
:
b
,
b
:
a
+
1
}
if
d
[
b
-
366
]
!=
b
or
d
[
a
+
(
b
-
a
)]
!=
Date
(
10
,
1
,
1913
):
if
d
[
b
-
366
]
!=
b
or
d
[
a
+
(
b
-
a
)]
!=
Date
(
10
,
1
,
1913
):
raise
DateTestError
,
'dictionary failure'
raise
DateTestError
,
'dictionary failure'
# verify date<->number conversions for first and last days for
# verify date<->number conversions for first and last days for
# all years in firstyear .. lastyear
# all years in firstyear .. lastyear
...
@@ -206,13 +206,13 @@ def test( firstyear, lastyear ):
...
@@ -206,13 +206,13 @@ def test( firstyear, lastyear ):
lord
=
_days_before_year
(
firstyear
)
lord
=
_days_before_year
(
firstyear
)
y
=
firstyear
y
=
firstyear
while
y
<=
lastyear
:
while
y
<=
lastyear
:
ford
=
lord
+
1
ford
=
lord
+
1
lord
=
ford
+
_days_in_year
(
y
)
-
1
lord
=
ford
+
_days_in_year
(
y
)
-
1
fd
,
ld
=
Date
(
1
,
1
,
y
),
Date
(
12
,
31
,
y
)
fd
,
ld
=
Date
(
1
,
1
,
y
),
Date
(
12
,
31
,
y
)
if
(
fd
.
ord
,
ld
.
ord
)
!=
(
ford
,
lord
):
if
(
fd
.
ord
,
ld
.
ord
)
!=
(
ford
,
lord
):
raise
DateTestError
,
(
'date->num failed'
,
y
)
raise
DateTestError
,
(
'date->num failed'
,
y
)
fd
,
ld
=
_num2date
(
ford
),
_num2date
(
lord
)
fd
,
ld
=
_num2date
(
ford
),
_num2date
(
lord
)
if
(
1
,
1
,
y
,
12
,
31
,
y
)
!=
\
if
(
1
,
1
,
y
,
12
,
31
,
y
)
!=
\
(
fd
.
month
,
fd
.
day
,
fd
.
year
,
ld
.
month
,
ld
.
day
,
ld
.
year
):
(
fd
.
month
,
fd
.
day
,
fd
.
year
,
ld
.
month
,
ld
.
day
,
ld
.
year
):
raise
DateTestError
,
(
'num->date failed'
,
y
)
raise
DateTestError
,
(
'num->date failed'
,
y
)
y
=
y
+
1
y
=
y
+
1
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment