This code could be made much more readable by factoring out a few non-member static inline helper functions.

    void micros_to_date(int64_t epoch_micros_in, boost::gregorian::date& date_out);
    void micros_to_date_and_time(int64_t epoch_micros_in, boost::gregorian::date& date_out, boost::posix_time::time_duration& time_out);

Both of these can do the bounds check and throw internally.
Also, make the -12212553600000000 value a named constant like GREGORIAN_EPOCH, as John suggested.

The next useful helper function is:

    int64_t epoch_microseconds_from_components(int year, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);

With this function. it is now very easy to implement each of the year-through-second functions with much less code just by passing the correct number of arguments. Quarter is just a little trickier because you have to calculate the month.