hello, using datetimes from a lot of different sources, in many languages, I had about 30 python helper routines, which I now packed in one class, much simpler. Although I used the Delphi date-format as the base, it shouldn't be difficult to rewrite the class for another type.
The input can be one of the following types : - None : the current date-time is used - 30000.9 : a Delphi datetime - 30000 : a Delphi datetime - "30000.9" : a Delphi datetime as a string - "30000,9" : a Delphi datetime as a (Dutch) string - "20-5-11" : short year notation - "20-05-2011" : long year notation - "2009-09-24 10:12:24" : Access string - datetime.datetime ( 2011, 1, 15 ) - time.struct_time - wx.DateTime - time.time() (through method from_time) Maybe someone can use it. cheers, Stef
import time import datetime import wx Delphi_Date_0 = datetime.date ( *time.strptime ( '30-12-1899', '%d-%m-%Y' )[0:3]).toordinal() # ************************************************************************ # ************************************************************************ class Delphi_Date ( float ) : def __new__ ( self, Something = None ) : """ Class meant to handle any datetime type, and converts it basically to a Delphi DateTime (float: number of days since 1-1-1900). The input can be one of the following types : - None : the current date-time is used - 30000.9 : a Delphi datetime - 30000 : a Delphi datetime - "30000.9" : a Delphi datetime as a string - "30000,9" : a Delphi datetime as a (Dutch) string - "20-5-11" : short year notation - "20-05-2011" : long year notation - "2009-09-24 10:12:24" : Access string - datetime.datetime ( 2011, 1, 15 ) - time.struct_time - wx.DateTime with extra methods, also the following can be used - from_time : time.time float The following output methods are available - to_time () - to_datetime () - to_String ( self , Format = "%d-%m-%Y" ) - to_String_Short () - to_String_Date_Time_Short () - to_String_Time_Short () - to_String_Date_Time () - to_wxTime () - to_Iso () """ # The current date-time is used, if no parameter is specified if Something is None : Something = datetime.datetime.now () # floating point is assumed to be a Delphi datetime # to specify a time.time float, use the method from_time # Delphi_Date().from_time ( time.time() # which is equivalent to # Delphi_Date() if isinstance ( Something, float ) : Value = Something # sometimes a Delphi datetime is stored as an integer elif isinstance ( Something, int ) : Value = Something # A string can represent a lot of things elif isinstance ( Something, basestring ) : # a float or integer, # also the Ducth notation where deceimal separator is a comma try : Value = float ( Something.replace(',','.') ) except : # a string as a short year notation try : Value = datetime.datetime.strptime ( Something, '%d-%m-%y' ) except ValueError : # a string as a long year notation try: Value = datetime.datetime.strptime ( Something, '%d-%m-%Y' ) except : # a string as a (Dutch) Access notation try : # Access string : "2009-09-24 00:00:00" Value = datetime.datetime.strptime ( Something.split(' ')[0], "%Y-%m-%d" ) except : Value = Delphi_Date_0 import traceback traceback.print_exc Value = Value.toordinal() - Delphi_Date_0 # datetime.datetime () elif isinstance ( Something, datetime.datetime ) : Value = Something.toordinal() - Delphi_Date_0 # time.struct_time elif isinstance ( Something, time.struct_time ) : Value = time.mktime ( Something ) DT = datetime.datetime.fromtimestamp ( Value ) Value = DT.toordinal() - Delphi_Date_0 # wx.DateTime elif isinstance ( Something, wx.DateTime ) : DT = datetime.date ( Something.GetYear (), Something.GetMonth () + 1, Something.GetDay () ) Value = DT.toordinal() - Delphi_Date_0 else : print type(Something), Something raise error ( 'aap' ) return float.__new__ ( self, Value ) def from_time ( self, Time ) : DT = datetime.datetime.fromtimestamp ( Time ) return Delphi_Date ( DT ) def to_time ( self ): return time.mktime ( self.to_datetime().timetuple() ) def to_datetime ( self ) : #return datetime.datetime.fromordinal ( int ( round ( self + Delphi_Date_0 ))) return datetime.datetime.fromordinal ( self + Delphi_Date_0 ) def to_String ( self , Format = "%d-%m-%Y" ) : DT = self.to_datetime() try : return DT.strftime ( Format ) except : return '01-01-1900' def to_String_Short ( self ) : DT = self.to_datetime() return DT.strftime ( "%d-%m-%y" ) def to_String_Date_Time_Short ( self ) : return self.to_String ( "%d-%m-%Y %H:%M" ) def to_String_Time_Short ( self ) : return self.to_String ( "%H:%M" ) def to_String_Date_Time ( self ) : return self.to_String ( "%d-%m-%Y %H:%M:%S" ) def to_wxTime( self ) : DT = self.to_datetime() WX = wx.DateTime() WX.Set ( DT.day, DT.month-1, DT.year ) return WX def to_Iso ( self ) : """ Transforms a Delphi Datetime into an ISO tuple: ( year, week, day-of-week ) """ return self.to_datetime().isocalendar () # ************************************************************************
-- http://mail.python.org/mailman/listinfo/python-list