PHP에서 date_sunset () 함수를 사용하여 일몰 시간을 계산할 때 개발자는 종종 눈에 띄지 않지만 중요한 문제를 겪습니다. 부정확하거나 무시한 시간대 구성으로 인해 계산 결과가 1 시간 이상 다른 일이 발생할 수 있으며, 시간 판단 (예 : 야간 조명 제어 시스템, 실외 활동 알림 등)에 따라 논리에 심각하게 영향을 미칩니다. 이 기사는이 기능의 시간대 원리를 파악하고 함정을 피하기 위해 올바르게 설정하는 방법을 보여줍니다.
date_sunset () 은 PHP의 내장 기능으로 지정된 날짜, 위도 및 경도에 해당하는 일몰 시간을 반환합니다. 기본 구문은 다음과 같습니다.
date_sunset(
int $timestamp,
int $format = SUNFUNCS_RET_STRING,
float $latitude = ini_get("date.default_latitude"),
float $longitude = ini_get("date.default_longitude"),
float $zenith = ini_get("date.sunset_zenith"),
float $gmt_offset = 0
): string|int|float|false
가장 중요한 매개 변수는 마지막 : $ gmt_offset , 즉 GMT와의 시차 입니다. 이것이 시간대를 설정하는 유일한 방법입니다.
많은 사람들이 PHP의 date_default_timezone_set () 함수를 사용하여 시간대를 설정하는 데 사용됩니다.
date_default_timezone_set('Asia/Shanghai');
이 설정은 date () 및 strtotime () 과 같은 함수의 출력에 영향을 미치지 만 date_sunset () 의 결과에는 영향을 미치지 않습니다 ! 이것은 개발자가 무시하는 가장 쉬운 것입니다.
// 오류 데모
date_default_timezone_set('Asia/Shanghai');
echo date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // 결과가있을 수 있습니다 GMT 시간
위의 코드는 상하이 시간대를 설정하지만 반환 된 일몰 시간은 여전히 GMT 시간이므로 오류가 발생합니다.
date_sunset ()을 현지 시간과 일치시키는 결과를 반환하려면 GMT 오프셋 값을 수동으로 몇 시간 안에 통과해야합니다 . 예를 들어, 중국 표준 시간이 GMT+8 인 경우 $ gmt_offset = 8.0을 설정해야합니다.
date_default_timezone_set('Asia/Shanghai'); // 이 단계는 영향을 미치지 않습니다 date_sunset,그러나 여전히 통일 된 방식으로 설정하는 것이 좋습니다.
// 상하이:위도 31.2304, 경도 121.4737
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, 8.0);
echo "상하이的日落시간为:$sunset";
출력 예 :
상하이的日落시간为:18:45
수익은 현지 시간이며 더 이상 GMT가 아닙니다.
코드가 Dead Offset 값을 작성하는 대신 배포 서버의 시간대에 자동으로 적응하려면 다음을 수행 할 수 있습니다.
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600; // 몇 초 만에 시간을 돌리십시오
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, $gmtOffset);
echo "当前时区下的日落시간为:$sunset";
이러한 방식으로, 다른 국가의 서버에 코드가 배포 되더라도 올바른 일몰 시간을 자동으로 계산할 수 있습니다.
사용자 도시의 일몰 시간을 반환하기 위해 인터페이스를 제공하고 싶다고 가정하면 반품 결과는 다음과 같습니다.
{
"city": "상하이",
"sunset": "18:45"
}
다음 인터페이스 로직을 빌드 할 수 있습니다 (주소는 균일하게 m66.net 입니다) :
// 샘플 인터페이스 주소:https://api.m66.net/sunset.php?lat=31.2304&lng=121.4737
$lat = $_GET['lat'] ?? 31.2304;
$lng = $_GET['lng'] ?? 121.4737;
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600;
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $lng, 90.0, $gmtOffset);
echo json_encode([
"city" => "상하이",
"sunset" => $sunset
]);
date_sunset ()은 PHP의 기본 시간대를 자동으로 사용하지 않습니다.
$ gmt_offset 매개 변수는 몇 시간 안에 수동으로 전달되어야합니다.
코드 적응성을 향상시키기 위해 현재 오프셋 값을 동적으로 계산하는 것이 좋습니다.
비즈니스 로직 오류를 피하기 위해 GMT를 현지 시간으로 전환하는 데주의를 기울이십시오.
태양의 위치와 관련된 기능을 처리 할 때 시간 정확도는 비즈니스 정확도와 같습니다 . 한 시간의 작은 편차가 시스템 논리를 망치게하지 마십시오.