def date_and_time(value, formatting="N j, Y, h:i a"):
    """
    Reformats a date string in a humanized format, AP style by default.
    """
    try:
        dt = dateparse(value)
    except ValueError:
        return value
    return dateformater(dt, formatting)
def date_and_time(value, formatting="N j, Y, h:i a"):
    """
    Reformats a date string in a humanized format, AP style by default.
    """
    try:
        dt = dateparse(value)
    except ValueError:
        return value
    return dateformater(dt, formatting)
def short_ap_date(value, date_format=None, upper=False):
    """
    Reformats a date string as in an abbreviated AP format.
    
        Example:
        
             >> short_ap_date('2010-04-03')
            'Apr. 2, 2011'
    
    If the date format cannot be automatically detected, you can specify it
    with the keyword argument.
    """
    # Split any date ranges and create a list
    value = value.replace("–", "-")
    date_parts = value.split(" - ")
    date_list = []
    for date_string in date_parts:
        try:
            if date_format:
                dt = datetime.strptime(date_string, date_format)
            else:
                dt = dateparse(date_string)
        except ValueError:
            return value
        # Check if this date is a "month-only" date
        # that needs to be specially formatted.
        if re.match('^\w{3,}\.?\s\d{4}$', date_string):
            dt = dateformater(dt, "M Y")
        # Otherwise just use the standard format
        else:
            dt = dateformater(dt, "M j, Y")
        # All months except May are abbreviated
        # and need a period added.
        if not dt.startswith("May"):
            dt = dt[:3] + "." + dt[3:]
        if upper == True:
            date_list.append(dt.upper())
        else:
            date_list.append(dt)
    return " – ".join(date_list)
def short_ap_date(value, date_format=None):
    """
    Reformats a date string as in an abbreviated AP format.
    
        Example:
        
             >> short_ap_date('2010-04-03')
            'Apr. 2, 2011'
    
    If the date format cannot be automatically detected, you can specify it
    with the keyword argument.
    """
    # Split any date ranges and create a list
    value = value.replace("–", "-")
    date_parts = value.split(" - ")
    date_list = []
    for date_string in date_parts:
        try:
            if date_format:
                dt = datetime.strptime(date_string, date_format)
            else:
                dt = dateparse(date_string)
        except ValueError:
            return value
        # Check if this date is a "month-only" date
        # that needs to be specially formatted.
        if re.match('^\w{3,}\.?\s\d{4}$', date_string):
            dt = dateformater(dt, "M Y")
        # Otherwise just use the standard format
        else:
            dt = dateformater(dt, "M j, Y")
        # All months except May are abbreviated
        # and need a period added.
        if not dt.startswith("May"):
            dt = dt[:3] + "." + dt[3:]
        date_list.append(dt)
    return " – ".join(date_list)