2011-11-04 18 views

Respuesta

36

Establecer la zona horaria predeterminada en primer lugar y obtener la fecha a continuación, la fecha será en la zona horaria que especifique:

<?php 
date_default_timezone_set('America/New_York'); 
$date= date('m-d-Y') ; 
?> 

http://php.net/manual/en/function.date-default-timezone-set.php

+6

Tenga en cuenta que el uso de 'date_default_timezone_set()' establece para todo el uso de 'date()' después de ese punto. Consulte mi respuesta para ver un ejemplo de cómo administrar varias zonas horarias. – DesignerGuy

+5

Actualmente es una mala práctica si solo quiere obtener 1 fecha en esa zona horaria, consulte la respuesta de DesignerGuy a continuación para obtener una solución más concreta. –

+0

Sería bueno tener una forma general de seleccionar la zona horaria. – Zan

-1
<?php 
date_default_timezone_set('GMT-5');//Set New York timezone 
$today = date("F j, Y") 
?> 
3

Si tiene acceso a PHP 5.3, el intl extension es muy agradable para hacer cosas como esta.

He aquí un ejemplo del manual:

$fmt = new IntlDateFormatter("en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN ); 
$fmt->format(0); //0 for current time/date 

En su caso, se puede hacer:

$fmt = new IntlDateFormatter("en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
     'America/New_York'); 
$fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime(). 

Como se puede establecer una zona horaria como America/New_York, esto es mucho mejor que usar una Desplazamiento GMT o UTC, ya que esto también toma en cuenta los períodos de ahorro de luz diurna.

Finalmente, como la extensión intl usa datos de la ICU, que contiene muchas funciones muy útiles cuando se trata de crear sus propios formatos de fecha/hora.

94

Las otras respuestas establecen la zona horaria para todas las fechas de su sistema. Esto no siempre funciona bien si desea admitir varias zonas horarias para sus usuarios.

Aquí está la versión corta:

<?php 
$date = new DateTime("now", new DateTimeZone('America/New_York')); 
echo $date->format('Y-m-d H:i:s'); 

Obras en PHP> = 5.2.0

lista de zonas horarias compatibles: php.net/manual/en/timezones.php


Aquí hay una versión con un tiempo y ajuste existente zona horaria según configuración de usuario

<?php 

$usersTimezone = 'America/New_York'; 
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone)); 
echo $date->format('Y-m-d H:i:s'); 

Aquí es una versión más detallado para mostrar el proceso un poco más claramente

<?php 

// Date for a specific date/time: 
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT'); 

// Output date (as-is) 
echo $date->format('l, F j Y g:i:s A');  

// Output line break (for testing) 
echo "\n<br />\n"; 

// Example user timezone (to show it can be used dynamically) 
$usersTimezone = 'America/New_York'; 

// Convert timezone 
$tz = new DateTimeZone($usersTimezone); 
$date->setTimeZone($tz); 

// Output date after 
echo $date->format('l, F j Y g:i:s A'); 

Bibliotecas

  • Carbon - Una biblioteca fecha muy popular.
  • Chronos - Un reemplazo directo para Carbon centrado en la inmutabilidad. Vea a continuación sobre por qué eso es importante.
  • jenssegers/date - Una extensión de Carbon que agrega soporte multilingüe.

estoy seguro de que hay un número de otras bibliotecas disponibles, pero estos son unos pocos que estoy familiarizado.


Bono Lección: Inmutable Fecha Objetos

Mientras esté aquí, te voy a ahorrar algo de dolor de cabeza futuro. Digamos que quiere calcular 1 semana a partir de hoy y 2 semanas a partir de hoy. Es posible escribir algo de código como:

<?php 

// Create a datetime (now, in this case 2017-Feb-11) 
$today = new DateTime(); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo "---\n<br>"; 

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>"; 
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>"; 
echo "\n<br>"; 

La salida:

2017-02-11 
--- 
2017-03-04 
2017-03-04 
2017-03-04 

Hmmmm ... Eso no es lo que queríamos. La modificación de un objeto tradicional DateTime en PHP no solo devuelve la fecha actualizada sino que también modifica el objeto original.

Aquí es donde entra en DateTimeImmutable

$today = new DateTimeImmutable(); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo "---\n<br>"; 

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

echo $today->format('Y-m-d') . "\n<br>"; 
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>"; 
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>"; 

La salida:.

2017-02-11 
--- 
2017-02-11 
2017-02-18 
2017-02-25 

En este segundo ejemplo, obtenemos las fechas que esperábamos espalda. Al utilizar DateTimeImmutable en lugar de DateTime, evitamos mutaciones accidentales y prevemos posibles errores.

+0

Apreciar la respuesta @DesignerGuy, pero aquí hay una * lista * adecuada de zonas horarias compatibles: http://php.net/manual/en/timezones.php –

+1

Gracias @ChrisHarrison. Acabo de actualizar la respuesta. – DesignerGuy

+1

Esta debería ser la respuesta aceptada y era justo lo que estaba buscando. ¡Gracias! – Brett

1

He creado una función simple que puede utilizar para convertir el tiempo a todas las zonas horarias:

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') { 
     $given = new DateTime($datetime, new DateTimeZone("UTC")); 
     $given->setTimezone(new DateTimeZone($timezone)); 
     $output = $given->format("Y-m-d"); //can change as per your requirement 
     return $output; 
} 
Cuestiones relacionadas