Start and end times of recurring events
Some small things that jump out to me:


It looks like a lot of duplication in each if check
There are a lot of magic numbers
Those later if checks should probably be elif, unless it's possible to satisfy several of them in one pass
Day/week/month end are identical
You should probably have a single return at the bottom - the things that fill it are the same each time, so just use the checks to determine what gets returned.  Then you only need to change the formatting in one place if you decide to later.


I think I'd prefer to write this with a dictionary mapping adjustments to each type of frequency.  After doing this, calculating the return values for each category can be done by the same code:

adjustment = {
    end: {#dict for adjustments for each frequency},
    start: {#dict for adjustments for each frequency},
    prev_end: {#dict for adjustments for each frequency},
    prev_start: {#dict for adjustments for each frequency}
}

def get_international_dates(timezone, frequency):
    tz = pytz.timezone(timezone)
    today = datetime.now(tz).date()
    midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=True)
    last_full_day_midnight = int(midnight.astimezone(pytz.utc).strftime("%s"))   

    end = last_full_day_midnight - adjustment[end][frequency]
    start = end - adjustment[start][frequency]
    prev_end = end - adjustment[prev_end][frequency]
    prev_start = start - adjustment[prev_start][frequency]

    return end, start, prev_end, prev_start