I think the timestamp column of dba_objects is what you are after:
create table t(id integer);
create function f return integer as
n integer;
begin
select count(*) into n from t;
return n;
end;
/
select status, timestamp from user_objects where object_name='F';
STATUS TIMESTAMP
------- -------------------
VALID 2011-09-05:11:01:52
insert into t(id) values (1);
select f() from dual; -- ***no recompile needed***
select status, timestamp from user_objects where object_name='F';
STATUS TIMESTAMP
------- -------------------
VALID 2011-09-05:11:01:52
alter table t add dummy integer; -- ***invalidates f()***
select status, timestamp from user_objects where object_name='F';
STATUS TIMESTAMP
------- -------------------
INVALID 2011-09-05:11:01:52
select f() from dual; -- ***forces recompile***
select status, timestamp from user_objects where object_name='F';
STATUS TIMESTAMP
------- -------------------
VALID 2011-09-05:11:01:53 -- ***note the different timestamp***
so to get all functions compiled today for example:
select *
from dba_objects
where to_date(substr(timestamp,1,10), 'yyyy-mm-dd')>=trunc(sysdate)
and object_type='FUNCTION';
--edit
it may be safer to use last_ddl_time instead (see @Alex's comment below), but the caveat is that last_ddl_time is also changed on grants and revokes.