$timestamp = mktime($data['hours'], $data['minutes'], 0, $date['month'], $date['day'], $date['year']);
Dans un premier temps, je ne sais pas si tu l'as retapé à la main, mais tu as $data et dans les autres $date.
Je ne sais pas si c'est volontaire ou non.
La fonction date_default_timezone_set() ne fonctionne (en tout cas de mémoire) qu'avec la fonction date()
Donc le mieux est d'enregistrer dans ta BD la date en timestamp ou la date sur le fuseau GMT et faire les traitements avec la fonction date() directement en fonction du fuseau de l'utilisateur.