direi che gmdate() rende l'ora GMT che non e' detto sia quella del server.

date() e' scritto chiaramente che formatta una "data locale". il notice ti avvisa che non hai settato una data locale. tutto qui.

time() rende lo unix timestamp del server che sarebbe il default perche' dovrebbe dare un NOTICE?. date() credo usi la funzione time() per prendere il default. Sarebbe interessante verificare nel caso di un setlocale con LC_TIME diverso dall'ora locale del server, se time() e date() continuano a prelevare lo stesso timestamp.