Date is wrong on ‘all posts’ page

It could be because you are not supplying post id in time parameter function.

In place of the_time('d F') try using echo get_the_time('d F'm $post->ID) because it will give you the flexibility to supply post id when you are in a loop.

Reference: get_the_time Codex

EDIT

My bad, I guess $post variables are not being set by your method. I have designed the code as per your need.

<?php
//Retrieving all the Distinct years.
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date");

//Loop for printing yearwise Posts
foreach($years as $year){

    $the_query = new WP_Query(array(
        'post_type' =>  'post', //Replace your Post Type HERE. If retrieving from default posts then simple use *post* or remove element.
        'year'  =>$year
    ));
    echo '<h2>'.$year.'</h2>';
    echo '<ul>';
    while($the_query->have_posts()):
        $the_query->the_post();
        echo '<em>'.get_the_date('d F').'</em>';
        echo '<li><a href="'.get_permalink( $post->ID ).'">'.get_the_title().'</a></li>';       
        endwhile;
    wp_reset_postdata();
    }
    echo '</ul>'
?>

WP_query is the authentic way. to retrieve posts within wordpress DB, because it sets all the global and local variables automatically.