Hola, estaba viendo que si uno tiene en la computadora una fecha incorrecta a la actual todos los time() que son ejecutados en PHP me va a devolver la fecha de mi computadora y no la que realmente es. Lo que no sabía.
La fecha que devuelven las funciones de PHP no es la de la fecha de tu PC. Es la fecha del servidor que ejecuta PHP (que puede o no ser tu PC). Si lo alojas en un servidor en Taiwan que tenga configurado el timezone de Taiwan, mostrara fecha de Taiwan.
El timezone en las funciones date no es inútil. De hecho, es muy útil porque puede trabajar con diferentes zonas en software que requiera de ello. Lo que tendría menos sentido es que coja la fecha del usuario/navegador, que puede decir cualquier cosa y toca creerlo.
Lo recomendable siempre es que el servidor maneje fechas en UTC o GMT +0 y luego esas fechas se presenten al cliente adaptado a su zona horaria.
Lo ideal es no fiarse de la hora/fecha del usuario. A no ser que tengas una necesidad muy específica, lo suyo es no fiarse ni recoger el dato siquiera. Si aun así necesitas hacer una verificación (y confias en lo que el usuario te diga), puedes recoger la fecha/hora UTC del usuario con javascript y luego comparar la UTC que tenga tu servidor:
fecha.php<?php
function validateDate(int $dateUser): bool
{
// Margen de error en segundos.
// La consulta ajax puede tardar varios segundos en ejecutarse. Asegurate de tener un margen.
$dateMargin = 120;
// Si el valor absoluto de la diferencia entre Timestamp de usuario y servidor
// es superior al margen, no es una fecha valida y devolvemos false.
return (abs(time() - $dateUser) <= $dateMargin); }
if (!empty($_POST['localTime'])) { // recogemos localTime y lo comparamos con respuesta en formato JSON
$status = validateDate((int) $_POST['localTime']);
}
fecha.jsasync function testDate() {
try {
// Creamos un formData para pasarselo a PHP
// Con parametro localTime que es = la fecha UTC acutal en Unix Timestamp.
const formData = new FormData();
formData.append('localTime', Math.floor(Date.now() / 1000));
const request = await fetch('fecha.php', {
method: 'POST',
body: formData
});
response = await request.json();
// Si el status es falso, la fecha no es valida.
if (!response.status) {
alert('Fecha local no valida');
return false;
}
alert('Fecha local valida');
return true;
} catch(err) {
// Si occure algun durante el proceso...
alert('No se ha podido sincronizar la fecha');
console.log(err);
}
}
testDate();
PD: Aquí asumimos que la fecha del servidor esta bien y esta sincronizada. Lo cual no tiene porque ser siempre la verdad. En tal caso, en vez de recoger la fecha del servidor, puedes recoge la de otro servidor NTP del que te fíes tal y como te ha mostrado el compañero @MCKsys Argentina.
Saludos