PHP - strtime, 시간대 지정
데이트 문자열이 있어요, 말해봐요.2008-09-11
타임스탬프를 얻고 싶지만 PHP 기본값이 아닌 동적으로 시간대를 지정해야 합니다.
요약하자면, 저는 두 개의 끈을 가지고 있습니다.
$dateStr = '2008-09-11';
$timezone = 'Americas/New_York';
이것에 대한 타임스탬프는 어떻게 얻습니까?
편집: 하루 중 시간은 그날 자정이 될 것입니다.$dateStr = '2008-09-1100:00';
$date = new DateTime($dateStr, new DateTimeZone($timezone));
$timestamp = $date->format('U');
만약 당신이 PHP > 5.2를 실행하고 있다면 승인된 답변은 훌륭합니다 (나는 그것이 그들이 DateTime 클래스를 추가한 버전이라고 생각합니다).이전 버전을 지원하고 싶거나 기능적 접근 방식을 선호하는 경우 글로벌 설정을 수정하지 않는 다른 방법이 있습니다.
$dateStr = '2008-09-11 00:00:00';
$timezone = 'America/New_York';
$dtUtcDate = strtotime($dateStr. ' '. $timezone);
어떤 이유로 <5.2>를 사용하는 경우 이 기능이 작동합니다.
$reset = date_default_timezone_get();
date_default_timezone_set('America/New_York');
$stamp = strtotime($dateStr);
date_default_timezone_set($reset);
그러나 5.2 이상 버전의 경우 @salather의 답변을 선택할 것을 강력히 권장합니다.
시간대를 사용할 경우 DateTime 클래스를 사용하는 것이 좋습니다. 이 경우 DateTime::createFromFormat() 함수를 사용하여 다음과 같은 작업을 수행할 수 있습니다.
$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";
$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);
DateTime::createFromFormat 함수에 $tz를 입력하면 지정한 날짜가 몇 시간대에 있는지 알 수 있으므로 다른 시간대로 변환해야 할 때 다음과 같은 작업만 수행하면 됩니다.
$start = $dt->setTimeZone(new DateTimeZone('UTC'));
정확한 시간을 언급할 때마다 일광 절약 시간의 영향을 받지 않는 통일된 표준에 따라 시간을 유지합니다. (GMT와 UTC는 이와 동일하지만 UTC라는 용어를 사용하는 것이 좋습니다.)UTC는 줄루 또는 Z 시간으로도 알려져 있습니다.)
대신 로컬 시간 값을 사용하여 시간을 유지하도록 선택한 경우 나중에 타임스탬프를 명확하게 해석할 수 있도록 UTC의 로컬 시간 오프셋을 포함합니다.
경우에 따라 UTC 시간과 동등한 현지 시간을 모두 저장해야 할 수도 있습니다.이 작업은 두 개의 개별 필드에서 수행되는 경우가 많지만, 일부 플랫폼에서는 두 필드를 모두 단일 필드에 저장할 수 있는 날짜/시간 오프셋 유형을 지원합니다.
타임스탬프를 숫자 값으로 저장할 때는 Unix time을 사용합니다. 이는 1970-01-01T00:00:00Z(윤곽초 제외) 이후의 전체 초 수입니다.더 높은 정밀도가 필요한 경우 대신 밀리초를 사용합니다.이 값은 시간대 조정 없이 항상 UTC를 기준으로 해야 합니다.
나중에 타임스탬프를 수정해야 할 경우 원래 시간대 ID를 포함하여 오프셋이 기록된 원래 값에서 변경되었는지 확인할 수 있습니다.
이후 이벤트를 예약할 때 오프셋이 변경되는 것이 일반적이기 때문에 UTC 대신 일반적으로 현지 시간이 선호됩니다.답변 및 블로그 게시물을 참조하십시오.
표준 시간대 오프셋이 항상 시간의 정수인 것은 아닙니다(예: 인도 표준시는 UTC+05:30이고 네팔은 UTC+05:45를 사용함).
Java를 사용하는 경우 Java 8의 경우 java.time을 사용하거나 Java 7 이하의 경우 Joda Time을 사용합니다.을 사용하는 경우.NET, 노다 시간 사용을 고려하십시오.을 사용하는 경우.NET에서 Noda Time을 사용하지 않는 경우 DateTimeOffset이 DateTime보다 더 나은 경우가 많습니다.Perl을 사용하는 경우 DateTime을 사용합니다.Python을 사용하는 경우에는 pytz 또는 dateutil을 사용합니다.JavaScript를 사용하는 경우 moment.js를 moment-timezone 확장자와 함께 사용합니다.PHP > 5.2를 사용하는 경우 DateTime 및 DateTimeZone 클래스에서 제공하는 기본 표준 시간대 변환을 사용합니다.사용 시 주의하십시오.
DateTimeZone::listAbreviations() - 답변을 참조하십시오.PHP를 최신 Olson 데이터로 유지하려면 주기적으로 시간대 b PECL 패키지를 설치합니다. 답변을 참조하십시오.
C++를 사용하는 경우 IANA 표준 시간대 데이터베이스를 올바르게 구현한 라이브러리를 사용해야 합니다.여기에는 cctz, ICU 및 Howard Hinnant의 "tz" 라이브러리가 포함됩니다.
표준 시간대 변환에 Boost를 사용하지 마십시오.API는 표준 IANA(일명 "zoneinfo") 식별자를 지원한다고 주장하지만, 각 영역이 가질 수 있는 풍부한 변경 내역을 고려하지 않고 고정 오프셋에 대략적으로 매핑합니다.
(또한 파일이 유지 관리 대상에서 제외되었습니다.)
대부분의 비즈니스 규칙은 UTC 또는 GMT가 아닌 일반 시간을 사용하므로 응용 프로그램 로직을 적용하기 전에 UTC 타임스탬프를 로컬 시간대로 변환할 계획입니다.
표준 시간대와 오프셋은 고정되지 않으며 변경될 수 있습니다.예를 들어, 역사적으로 미국과 영국은 '스프링 포워드'와 '폴백'에 동일한 날짜를 사용했습니다.
하지만, 2007년에 미국은 시계가 바뀌는 날짜를 변경했습니다.이것은 일년 중 48주 동안 런던 시간과 뉴욕 시간의 차이가 5시간이고 4주 동안(봄에는 3시간, 가을에는 1시간) 4시간이라는 것을 의미합니다.여러 영역을 포함하는 모든 계산에서 이와 같은 항목에 주의해야 합니다.
정확한 검색을 위해 저장해야 하는 요소(타임 스탬프, 시간대 오프셋 및 시간대 이름)가 무엇인지 시간 유형(실제 이벤트 시간, 브로드캐스트 시간, 상대 시간, 기록 시간, 반복 시간)을 고려합니다. 답변의 "시간 유형"을 참조하십시오.
OS, 데이터베이스 및 애플리케이션 tz 데이터 파일을 전 세계와 동기화할 수 있습니다.
서버에서 하드웨어 클럭 및 OS 클럭을 로컬 표준 시간대가 아닌 UTC로 설정합니다.
이전 글머리 기호와 상관없이 웹 사이트를 포함한 서버 측 코드는 서버의 로컬 표준 시간대가 특정 시간대가 될 것으로 예상해서는 안 됩니다.답을 보다
모든 서버에서 NTP 서비스를 사용합니다.
FAT32를 사용하는 경우 타임스탬프는 UTC가 아닌 현지 시간으로 저장됩니다.
반복 이벤트(예: 주간 TV 프로그램)를 처리할 때 시간은 DST에 따라 변경되며 시간대에 따라 달라집니다.
날짜-시간 값은 항상 하한 포함, 상한 제외(>=, <)로 쿼리합니다.
Laconic 응답(기본 표준 시간대를 변경할 필요 없음)
$dateStr = '2008-09-11';
$timezone = 'America/New_York';
$time = strtotime(
$dateStr,
// convert timezone to offset seconds
(new \DateTimeZone($timezone))->getOffset(new \DateTime) - (new \DateTimeZone(date_default_timezone_get()))->getOffset(new \DateTime) . ' seconds'
);
유창한 대답
사용하다strtotime
함수의 기준 프레임을 변경하는 두 번째 옵션입니다.스크립트의 기본 표준 시간대를 업데이트하지 않는 것이 좋습니다.
http://php.net/manual/en/function.strtotime.php
intstr time ( string $time [, int $now = time time ] )
함수에는 영어 날짜 형식이 포함된 문자열이 지정될 것으로 예상되며, 지금 지정된 타임스탬프 또는 지금 제공되지 않은 경우 현재 시간을 기준으로 해당 형식을 유닉스 타임스탬프(1970년 1월 1일 00:00:00 UTC 이후의 초 수)로 구문 분석하려고 시도합니다.
그리고 도우미
/**
* Returns the timestamp of the provided time string using a specific timezone as the reference
*
* @param string $str
* @param string $timezone
* @return int number of the seconds
*/
function strtotimetz($str, $timezone)
{
return strtotime(
$str, strtotime(
// convert timezone to offset seconds
(new \DateTimeZone($timezone))->getOffset(new \DateTime) - (new \DateTimeZone(date_default_timezone_get()))->getOffset(new \DateTime) . ' seconds'
)
);
}
var_export(
date(
'Y-m-d',
strtotimetz('this monday', 'America/New_York')
)
);
가장 성능이 좋은 방법은 아니지만 기본 표준 시간대와 오프셋을 알고 있을 때 잘 작동합니다.예를 들어, 기본 표준 시간대가UTC
그리고 오프셋은-8
시간:
var_dump(
date(
'Y-m-d',
strtotime('this tuesday', strtotime(-8 . ' hours'))
)
);
언급URL : https://stackoverflow.com/questions/3569014/php-strtotime-specify-timezone
'source' 카테고리의 다른 글
git 기록에서 병합 커밋 제거 (0) | 2023.08.27 |
---|---|
jQuery의 mouse out()과 mouse leave()의 차이점은 무엇입니까? (0) | 2023.08.27 |
CSS에서 !important는 무엇을 의미합니까? (0) | 2023.08.22 |
이 CSS는 어떻게 원을 생성합니까? (0) | 2023.08.22 |
Spring Boot connect Mysql과 MongoDb (0) | 2023.08.22 |