Something like this often works:
float fps = 24.0;
ISubDSchema schema = ...;
Alembic::AbcAbstract::TimeSamplingPtr ts = schema.getTimeSampling();
int numSamples = schema.getNumSamples();
float startTime = ts->getSampleTime(0);
float endTime = ts->getSampleTime(numSamples - 1);
float startFrame = startTime * fps;
float endFrame = endTime * fps;
It gets complicated for a number of reasons. Different objects in the cache could have different TimeSampling objects, they can be cyclic, acyclic, etc.
I've heard of people having success with just storing the start and end frames on their own as attributes, but that's pipeline specific.