Sort posts by multiple meta key values

I think the best way would be to store the complete date-time in one meta field, saving it as an timestamp in the metafield and converting it by php datetime object functions for displaying.

Step 1)
Create a Metabox with a text input for entering the date + time. You can find a good introduction to meta boxes here.

Step 1.5) if you want it to be easily usable, you can add a jquery plugin for date/time picking in the post edit screen, like this one.

Step 2)
in the myplugin_meta_box_callback function, convert the meta value $value into your desired display format using the php datetime functions like this:

if($value){
   $date = date_create($value);
   $value = date_format($date, 'Y-m-d H:i');
}    

Step 3)
In the save_metabox action, convert the date/time-Value by the php strtotime function to an unix timestamp like this:

Replace:

 $my_data = sanitize_text_field( $_POST['myplugin_new_field'] );

with:

 $my_data = strtotime($_POST['myplugin_new_field']);

Step 4)
In your archive, give your query the orderby “meta_value_num”, ordering it by numerical meta values of your custom field

Step 5)
Do NOT use query_posts.

Step 6)
Check in your while loop if the day of the current metavalue is higher than the day of the last metavalue

$day = 0;
while $query->have_post {
    $query->the_post;
    $newday = get_post_meta(get_the_ID(),'NAME_OF_METAFIELD',true);
    $newdate = date_create($newday);
    $newday = date_format($newdate,'d');
    if(!($newday==$day)) {
        $day = $newday;
        echo "Date:".date_format($newdate,'Y-m-d');
    }
    echo "Time:".date_format($newdate,'H:i');
    //All the other stuff that needs to be displayed
}

Step 7)
Done (more or less)… Do some tweaking

I didn’t include the if-then stuff for the hour, but I think you can figure it out^^