Let’s see if I can confuse myself.
If either of your two OR conditions is true the code executes.
is_home and is_front_page can return true for different pages, negated in your case. If you have a static from page, which it sounds like you do, then is_home is the blog index page.
Note: WordPress 2.1 handles this function differently than prior
versions – See static Front Page. If you select a static Page as your
frontpage (see is_front_page()), this tag will be applied to your
“posts page”.
What that means is that is_home will be false for every page except your blog index, which means that your !is_home conditional is true for every page except that blog index page and your code will run almost all the time.
Now the docs for is_front_page.
It returns TRUE when the main blog page is being displayed and the
Settings->Reading->Front page displays is set to “Your latest posts”,
or when is set to “A static page” and the “Front Page” value is the
current Page being displayed.
There are two possibilities depending on your settings. It might return true for your blog index page, or it might return true for your static page. I think that you have a static front page so is_front_page will return true for that page and the !is_front_page conditional will be false. Because !is_home is (probably, if I am following you) true the code still executes.
If you want to exclude <p><?php the_time('F Y'); ?></p> from both the blog index and the static front page, then negate the entire OR statement:
if( !(is_home() || is_front_page()) )
If either is true then the whole thing is false.
If you want to exclude it only from the front page, then you shouldn’t need the !is_home part at all.
If you use && instead of || then both is_home and is_front_page would have to be false for the code to run. That is, you are not on the blog index and not on the front at the same time.