programing

php의 시간대 변환

lastmoon 2023. 8. 10. 19:06
반응형

php의 시간대 변환

php에서 날짜와 시간을 다른 시간대로 변환하는 쉬운 방법을 제안할 수 있는 사람이 있습니까?

다음에 대해 datetime 개체 또는 해당 함수 별칭을 사용할 수 있습니다.

예제(PHP 설명서에서 요약)

date_default_timezone_set('Europe/London');

$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->format('Y-m-d H:i:s');

주석 관련 편집

하지만 다른 위치에서 사용자 로그인으로 다른 시간대의 날짜를 표시해야 하기 때문에 이 방법을 사용할 수 없습니다.

그건 문제가 아닙니다.사용자가 로그인할 때 시간대를 결정하고 표시된 것처럼 DateTime 개체로 설정합니다.저는 제 프로젝트 중 하나에서 비슷한 접근 방식을 사용하고 있으며 매력적으로 작동합니다.

데이터베이스에서 나는 단일 시간대의 날짜를 얻어야 하며, 그러면 그것만 제대로 처리될 수 있습니다.

시간은 타임스탬프 또는 날짜/시간으로 하나의 표준 시간대에 저장합니다.DateTime 필드를 쿼리할 때 DateTime 오브젝트의 시간을 이 표준시로 변환하거나 DB에서 지원하는 경우 선택한 표준시로 쿼리합니다.

더 간단한 방법은 다음과 같습니다.

date_default_timezone_set('Europe/London'); // your user's timezone
$my_datetime='2013-10-23 15:47:10';
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC"));

PHP 설명서에 설명된 것처럼 strtotime()도 시간대를 허용하므로 날짜 시간에 추가하면 됩니다.

모든 날짜 시간을 UTC에 저장하는 것이 좋습니다. 그렇게 하면 일광 절약 시간에 문제가 없을 것이기 때문입니다.

이것은 저에게 효과가 있었고 꽤 깨끗했습니다!

function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
    try {
        $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone));
        $dateTime->setTimezone(new DateTimeZone($userTimeZone));
        return $dateTime->format($format);
    } catch (Exception $e) {
        return '';
    }
}

function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
    try {
        $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone));
        $dateTime->setTimezone(new DateTimeZone($serverTimeZone));
        return $dateTime->format($format);
    } catch (Exception $e) {
        return '';
    }
}

//example usage
$serverDate = $userDate = '2014-09-04 22:37:22';
echo convert_to_user_date($serverDate);
echo convert_to_server_date($userDate);

이러한 답변 중 하나도 효과가 없었습니다(크기가 지나치게 큰 코드를 시도하지 않았습니다).저도 단일 변환에 대한 기본 시간대를 변경하는 것이 이상하다고 생각합니다.

제 솔루션은 다음과 같습니다.

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
  if (empty($timeZoneSource)) {
    $timeZoneSource = date_default_timezone_get();
  }
  if (empty($timeZoneTarget)) {
    $timeZoneTarget = date_default_timezone_get();
  }

  $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
  $dt->setTimezone(new DateTimeZone($timeZoneTarget));

  return $dt->format("Y-m-d H:i:s");
}

따라서 서버 기본값으로 변환하려면 하나의 표준 시간대만 통과하면 됩니다.

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");

서버 기본값에서 사용자로 변환하려면 두 번째 매개 변수를 null 또는 공백으로 둡니다.

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");

또한 기본값과 관련이 없는 2개의 표준 시간대를 전환하려면 2개의 표준 시간대를 제공합니다.

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");

UTC에서 로컬:

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

?>

DateTime::setTimezone -- date_timezone_set — DateTime 개체의 표준 시간대를 설정합니다.

객체 지향 스타일

<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>

절차 스타일

<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";

date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>

위의 예는 다음과 같이 출력됩니다.

2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
// Convert date from one zone to another..
/* 
$zone_from='Asia/Kolkata';

$zone_to='America/Phoenix';

date_default_timezone_set($zone_from);

$convert_date="2016-02-26 10:35:00";

echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to);

*/
function zone_conversion_date($time, $cur_zone, $req_zone)
{   
    date_default_timezone_set("GMT");
    $gmt = date("Y-m-d H:i:s");
    
    date_default_timezone_set($cur_zone);
    $local = date("Y-m-d H:i:s");
  
    date_default_timezone_set($req_zone);
    $required = date("Y-m-d H:i:s");
    
    /* return $required; */
    $diff1 = (strtotime($gmt) - strtotime($local));
    $diff2 = (strtotime($required) - strtotime($gmt));

    $date = new DateTime($time);
    $date->modify("+$diff1 seconds");
    $date->modify("+$diff2 seconds");

    return $timestamp = $date->format("Y-m-d H:i:s");
}
<?php
$time='6:02';
$dt = new DateTime($time, new DateTimeZone('America/New_York'));
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL;
$dt->setTimezone(new DateTimeZone('Asia/Kolkata'));
echo $dt->format('H:i') . PHP_EOL; 
?>
 Try this:    
 function convertDate($dt, $timeZone) {    
        $UTC = new DateTimeZone("UTC");
        $date= date('Y-m-d H:i:s', strtotime($dt)); 
        $dateConv = new DateTime( $dt, $UTC  );
        $dateFormat ='m/d/Y h:i A';
        $date->setTimezone(new DateTimeZone($timeZone));
        return $date->format($dateFormat);
    }

언급URL : https://stackoverflow.com/questions/2505681/timezone-conversion-in-php

반응형