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^^