zona horaria datetimezone date_default_timezone_set cambiar buenos america aires php datetime timezone

php - horaria - timezone laravel



php: configurar una zona horaria por desplazamiento UTC (10)

Al usar javascript, sé que la zona horaria de mis usuarios es UTC +3.

Ahora quiero crear el objeto DateTime con este conocimiento:

$usersNow = new DateTime(''now'', new DateTimeZone("+3"));

Recibo como respsonse:

''Unknown or bad timezone (+2)''

¿Qué estoy haciendo mal? ¿Cómo puedo arreglarlo?


Éste lleva la respuesta de Matthew un paso más allá para cambiar la zona horaria de una fecha a cualquier desplazamiento entero.

public static function applyHourOffset(DateTime $dateTime, int $hourOffset):DateTime { $dateWithTimezone = clone $dateTime; $sign = $hourOffset < 0 ? ''-'' : ''+''; $timezone = new DateTimeZone($sign . abs($hourOffset)); $dateWithTimezone->setTimezone($timezone); return $dateWithTimezone; }

Nota: Tuve una rotura en la producción debido a la respuesta aceptada.


DateTimeZone requiere una zona horaria no una más



Me dirigieron a una solución gracias al enlace de Joey Rivera. Al igual que lo que otros han dicho aquí, la zona horaria no es un desplazamiento, sí necesita una zona horaria válida.

Esto es lo que estoy usando para mí

$singapore_time = new DateTime("now", new DateTimeZone(''Asia/Singapore'')); var_dump( $singapore_time );

Yo mismo he encontrado que es mucho más conveniente trabajar con el formato YYYY-MM-DD HH: MM. ejemplo.

$original = new DateTime("2017-05-29 13:14", new DateTimeZone(''Asia/Singapore''));


Para cualquiera que se encuentre con esto, yo estaba enfrentando el mismo problema, así que al final extendí la clase DateTime y __construct() método __construct() para aceptar un desplazamiento (en minutos) en lugar de una zona horaria.

A partir de ahí, mi __construct() personalizado __construct() resuelve cuál es el desplazamiento en horas y minutos (por ejemplo, -660 = +11: 00) y luego utiliza parent::__construct() para entregar mi fecha, personalizada con el formato para incluir mi desplazamiento, de vuelta al DateTime original.

Como siempre estoy lidiando con los tiempos UTC en mi aplicación, mi clase también modifica el tiempo UTC restando el desplazamiento, por lo que pasar Midnight UTC y un desplazamiento de -660 me mostrará 11 am

Mi solución se detalla aquí: https://.com/a/35916440/2301484


Por lo que puedo decir de los documentos en DateTimeZone , necesita pasar un huso horario válido y aquí están los valid . Controle a los others , algo que pueda ayudarlo.


Qué tal esto...

$original = new DateTime("now", new DateTimeZone(''UTC'')); $timezoneName = timezone_name_from_abbr("", 3*3600, false); $modified = $original->setTimezone(new DateTimezone($timezoneName));



Tu dijiste:

Al usar javascript, sé que la zona horaria de mis usuarios es UTC +3.

Probablemente funcionó algo como esto:

var offset = new Date().getTimezoneOffset();

Esto devuelve el desplazamiento actual de UTC en minutos, con valores positivos que caen al oeste de UTC. ¡ No devuelve una zona horaria!

Una zona horaria no es un desplazamiento. Una zona horaria tiene un desplazamiento. Puede tener múltiples compensaciones diferentes . A menudo hay dos compensaciones, una para el horario estándar y otra para el horario de verano. Un solo valor numérico no puede representar esto solo.

  • Ejemplo de zona horaria: "America/New_York"
    • Corrección estándar correspondiente: UTC-5
    • Desplazamiento de luz diurna correspondiente: UTC-4

Además de las dos compensaciones, también están envueltas en esa zona horaria las fechas y horas de transición entre las dos compensaciones para que sepa cuándo se aplican. También hay un registro histórico de cómo las compensaciones y las transiciones pueden haber cambiado con el tiempo.

Consulte también "Zona horaria! = Compensación" en la wiki de la etiqueta de la zona horaria .

En su caso de ejemplo, probablemente recibió un valor de -180 de javascript, que representa un desplazamiento actual de UTC + 3. ¡Pero eso es solo la compensación para ese punto particular en el tiempo! Si sigue la respuesta de Minaz , obtendrá un huso horario que asume que UTC + 3 es siempre el desplazamiento correcto. Eso funcionaría si la zona horaria real es algo así como "Africa/Nairobi" que nunca ha usado nada excepto UTC + 3. Pero, por lo que sabe, su usuario podría estar en "Europe/Istanbul" , que usa UTC + 3 en verano y UTC + 2 en invierno.


intentaste esto

http://php.net/manual/en/function.strtotime.php

<?php echo strtotime("now"), "/n"; echo strtotime("10 September 2000"), "/n"; echo strtotime("+5 hours"); echo strtotime("+1 day"), "/n"; echo strtotime("+1 week"), "/n"; echo strtotime("+1 week 2 days 4 hours 2 seconds"), "/n"; echo strtotime("next Thursday"), "/n"; echo strtotime("last Monday"), "/n"; ?>