Differences between revisions 2 and 3
Revision 2 as of 2009-04-10 19:08:28
Size: 2642
Editor: CarlNobile
Comment:
Revision 3 as of 2010-04-01 20:05:46
Size: 3515
Editor: CarlNobile
Comment:
Deletions are marked like this. Additions are marked like this.
Line 8: Line 8:
class BaseUtils(object): class DateUtils(object):
Line 11: Line 11:

    def __init__(self):
        pass
    __YMD = "yyyy-mm-dd hh:mm:ss"
    __MDY = "mm-dd-yyyy hh:mm:ss"
    __DMY = "dd-mm-yyyy hh:mm:ss"
    __YMD_NON_DLM = "yyyymmddHHMMSS"
Line 16: Line 17:
        return value         size = len(value)
        y = value[:4]
        m = value[5:7]
        d = value[8:10]
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)
Line 19: Line 28:
        size = len(value)
Line 22: Line 32:

        if len(value) > 10:
            value = "%s-%s-%s %s" % (y, m, d, value[11:])
        else:
            value = "%s-%s-%s 00:00:00" % (y, m, d)

        return value
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)
Line 31: Line 39:
        size = len(value)
Line 34: Line 43:

        if len(value) > 10:
            value = "%s-%s-%s %s" % (y, m, d, value[11:])
        else:
            value = "%s-%s-%s 00:00:00" % (y, m, d)

        return value
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)
Line 43: Line 50:
        size = len(value)
Line 46: Line 54:
        H = value[8:10]
        M = value[10:12]
        H = M = S = 0
        if size >= 10: H = value[8:10]
        if size >= 12: M = value[10:12]
        if size >= 14: S = value[12:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)
Line 49: Line 60:
        if len(value) > 12:
            S = value[12:]
            value = "%s-%s-%s %s:%s:%s" % (y, m, d, H, M, S)
        else:
            value = "%s-%s-%s %s:%s:00" % (y, m, d, H, M)

        return value

__FROM_DATE_FORMATS = {'yyyy-mm-dd hh:mm:ss': __transposeFromYMDHMS,
                           'mm-dd-yyyy hh:mm:ss': __transposeFromMDYHMS,
                           'dd-mm-yyyy hh:mm:ss': __transposeFromDMYHMS,
                           'yyyymmddHHMMSS': __transposeNonDelimiterYMDHMS}
    __FROM_DATE_FORMATS = {__YMD: __transposeFromYMDHMS,
                           __MDY: __transposeFromMDYHMS,
                           __DMY: __transposeFromDMYHMS,
                           __YMD_NON_DLM: __transposeNonDelimiterYMDHMS}
Line 72: Line 75:
        format = self.__dateRegex.sub('-', format)         fmt = self.__dateRegex.sub('-', format)
Line 75: Line 78:
            value = self.__FROM_DATE_FORMATS[format](self, value)             value = self.__FROM_DATE_FORMATS[fmt](self, value)
Line 78: Line 81:
            msg = "Invalid date format should be one of %s." % \
                  self.__FROM_DATE_FORMATS.keys()
            raise KeyError(msg
)
            msg = "Invalid date format should be one of %s."
            raise KeyError(msg % self.__FROM_DATE_FORMATS.keys())
Line 87: Line 89:
                  (format, value, e)                   (fmt, value, e)
Line 89: Line 91:

    @classmethod
    def _snoopDateFormat(self, value):
        """
        By it's very nature this method cannot work. Is 01/01/2000 MM/DD/YYYY
        or DD/MM/YYYY?
        """
        fmt = None
        delim = any([char for char in value if char in ('-', '.', '/', ':')])
        year = value[:4].isdigit()

        if year and not delim: fmt = self.__YMD_NON_DLM
        elif year and delim: fmt = self.__YMD
        else: pass # Cannot determine the else.

        return fmt

Date/Time Conversion

import re
from datetime import datetime


class DateUtils(object):
    __DATE_REGEX = r"[/.]+"
    __dateRegex = re.compile(__DATE_REGEX)
    __YMD = "yyyy-mm-dd hh:mm:ss"
    __MDY = "mm-dd-yyyy hh:mm:ss"
    __DMY = "dd-mm-yyyy hh:mm:ss"
    __YMD_NON_DLM = "yyyymmddHHMMSS"

    def __transposeFromYMDHMS(self, value):
        size = len(value)
        y = value[:4]
        m = value[5:7]
        d = value[8:10]
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)

    def __transposeFromMDYHMS(self, value):
        size = len(value)
        m = value[:2]
        d = value[3:5]
        y = value[6:10]
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)

    def __transposeFromDMYHMS(self, value):
        size = len(value)
        d = value[:2]
        m = value[3:5]
        y = value[6:10]
        H = M = S = 0
        if size >= 13: H = value[11:13]
        if size >= 16: M = value[14:16]
        if size >= 19: S = value[17:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)

    def __transposeNonDelimiterYMDHMS(self, value):
        size = len(value)
        y = value[:4]
        m = value[4:6]
        d = value[6:8]
        H = M = S = 0
        if size >= 10: H = value[8:10]
        if size >= 12: M = value[10:12]
        if size >= 14: S = value[12:]
        return "%s-%s-%s %02i:%02i:%02i" % (y, m, d, H, M, S)

    __FROM_DATE_FORMATS = {__YMD: __transposeFromYMDHMS,
                           __MDY: __transposeFromMDYHMS,
                           __DMY: __transposeFromDMYHMS,
                           __YMD_NON_DLM: __transposeNonDelimiterYMDHMS}

    @classmethod
    def toDatetime(self, value, format='yyyy-mm-dd hh:mm:ss'):
        """
        Convert a string representation of a date and time to a python
        datetime object.

        @param value: The string value to convert.
        @keyword format: The format to convert from.
        @return: A Python datetime object.
        """
        fmt = self.__dateRegex.sub('-', format)

        try:
            value = self.__FROM_DATE_FORMATS[fmt](self, value)
            date, time = value.split(' ')
        except KeyError, e:
            msg = "Invalid date format should be one of %s."
            raise KeyError(msg % self.__FROM_DATE_FORMATS.keys())

        try:
            return datetime(*[int(float(x)) for x in date.split("-")] +
                            [int(float(x)) for x in time.split(":")])
        except Exception, e:
            msg = "Invalid format for datetime %s, found: %s, %s" % \
                  (fmt, value, e)
            raise Exception(msg)

    @classmethod
    def _snoopDateFormat(self, value):
        """
        By it's very nature this method cannot work. Is 01/01/2000 MM/DD/YYYY
        or DD/MM/YYYY?
        """
        fmt = None
        delim = any([char for char in value if char in ('-', '.', '/', ':')])
        year = value[:4].isdigit()

        if year and not delim: fmt = self.__YMD_NON_DLM
        elif year and delim: fmt = self.__YMD
        else: pass # Cannot determine the else.

        return fmt

datetimeConversion (last edited 2010-12-23 04:49:47 by CarlNobile)