Почему time() выводит неправильное время?
time() - это unix timestamp.
unix timestamp - это время в utc, и установка таймзоны не играет никакого рояля.
Обычно когда требуется учет временных зон, то с time() не работают.