Files
Phoenix/wx/lib/CDate.py
Robin Dunn 6ad7622dec PR 29 from Werner
- make CDate compatible with py2/py3
- add documentation to CDate and add Phoenix tags
- create some unittests for CDate

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@75591 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2014-01-11 21:39:23 +00:00

197 lines
4.9 KiB
Python

# Name: CDate.py
# Purpose: Date and Calendar classes
#
# Author: Lorne White (email: lwhite1@planet.eon.net)
#
# Created:
# Version 0.2 08-Nov-1999
# Licence: wxWindows license
# Tags: phoenix-port, py3-port, documented, unittest
#----------------------------------------------------------------------------
# Updated: 01-Dec-2004
# Action: Cast the year variable to an integer under the Date Class
# Reason: When the year was compared in the isleap() function, if it was
# in a string format, then an error was raised.
#
"""Date and calendar classes and date utitility methods."""
import time
Month = {0: None,
1: 'January', 2: 'February', 3: 'March',
4: 'April', 5: 'May', 6: 'June',
7: 'July', 8: 'August', 9: 'September',
10: 'October', 11: 'November', 12: 'December'}
# Number of days per month (except for February in leap years)
mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# Full and abbreviated names of weekdays
day_name = ['Sunday', 'Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday', 'Saturday']
day_abbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri',
'Sat']
def leapdays(y1, y2):
"""
Return number of leap years in range [y1, y2]
Assume y1 <= y2 and no funny (non-leap century) years
"""
return (y2 + 3) / 4 - (y1 + 3) / 4
def isleap(year):
"""Verify if year is a leap year.
:param int `year`: the year to check
:return: True or False
"""
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
def FillDate(val):
s = str(val)
if len(s) < 2:
s = '0' + s
return s
def julianDay(year, month, day):
"""Convert a date to Julian
:param int `year`: the year
:param int `month`: the month
:param int `day`: the day
:returns: the julian date number
"""
b = 0
if month > 12:
year = year + month / 12
month = month % 12
elif month < 1:
month = -month
year = year - month / 12 - 1
month = 12 - month % 12
if year > 0:
yearCorr = 0
else:
yearCorr = 3
if month < 3:
year = year - 1
month = month + 12
if year * 10000 + month * 100 + day > 15821014:
b = 2 - year / 100 + year / 400
return (1461 * year - yearCorr) / 4 + 306001 * (month + 1) / 10000 + day + 1720994 + b
def TodayDay():
date = time.localtime(time.time())
year = date[0]
month = date[1]
day = date[2]
julian = julianDay(year, month, day)
daywk = dayOfWeek(julian)
daywk = day_name[daywk]
return(daywk)
def FormatDay(value):
date = FromFormat(value)
daywk = DateCalc.dayOfWeek(date)
daywk = day_name[daywk]
return(daywk)
def FromJulian(julian):
"""Convert a julian date
:param int `julian`: the julian date to convert
:returns: year, month day as integers
"""
if (julian < 2299160):
b = julian + 1525
else:
alpha = (4 * julian - 7468861) / 146097
b = julian + 1526 + alpha - alpha / 4
c = (20 * b - 2442) / 7305
d = 1461 * c / 4
e = 10000 * (b - d) / 306001
day = int(b - d - 306001 * e / 10000)
if e < 14:
month = int(e - 1)
else:
month = int(e - 13)
if month > 2:
year = c - 4716
else:
year = c - 4715
year = int(year)
return year, month, day
def dayOfWeek(julian):
"""Get day of week from a julian day
param `julian`: the julian day
returns: the day of week as an integer and Monday = 1
"""
return int((julian + 1) % 7)
def daysPerMonth(month, year):
"""Get the number of days for the month.
:param int `month`: the month
:param int `year`: the year
:returns: the number of days in the requested month
"""
ndays = mdays[month] + (month == 2 and isleap(year))
return ndays
class now(object):
"""A now date class"""
def __init__(self):
"""
Default class constructor.
"""
self.date = time.localtime(time.time())
self.year = self.date[0]
self.month = self.date[1]
self.day = self.date[2]
self.hour = self.date[3]
self.minutes = self.date[4]
self.secondes = self.date[5]
self.day_of_week = self.date[6]
self.julian = julianDay(self.year, self.month, self.day)
class Date(object):
"""A date class"""
def __init__(self, year, month, day):
"""
Default class constructor.
:param `year`: the year as an int or string
:param `month`: the month as an int or string
:param `day`: the day as an int or string
"""
self.julian = julianDay(year, month, day)
self.month = int(month)
self.year = int(year)
self.day = int(day)
self.day_of_week = dayOfWeek(self.julian)
self.days_in_month = daysPerMonth(self.month, self.year)