- A:先根据经纬度获取当地时区 (注):计算的区时=已知区时-(已知区时的时区-要计算区时的时区)(注:东时区为正,西时区为负)
- B:然后根据本地时间与当地时区推算出当地时间
- C:这是我百度找到怎么计算时区与时间
计算时区
/**
* 计算时间
* 1 先根据经度计算出时区
* 2 然根据本地时区推算出其他地方时间(已中国上海为例)
* 东区快一个小时
* 西区慢一个小时
* 东经和西经,分别用“E”和“W”表示。
* 东经为正数,西经为负数。
* 计算的区时=已知区时-(已知区时的时区-要计算区时的时区)(注:东时区为正,西时区为负)
*/
function znoe_time($long)
{
$eastZnoe = '';
$westZnoe = '';
if ($long > 0) {//东区
//计算时区
$znoe = ($long / 15);
$znoe_mod = abs($long % 15);//取余
$znoe = intval($znoe);//商数
if ($znoe_mod > 7.5) {//大于7.5 加1
$znoe = $znoe + 1;
$eastZnoe = "GMT" . ($znoe);
} else {//小于7.5 //取时区
$eastZnoe = "GMT" . ($znoe);
}
} else {//西区 //计算的区时=已知区时-(已知区时的时区-要计算区时的时区)。(注:东时区为正,西时区为负)
//计算时区
$znoe = ($long / 15);
$znoe_mod = abs($long % 15);//取余
$znoe = intval($znoe);//商数
if ($znoe_mod > 7.5) {//余数大于7.5 加1
$znoe = ($znoe - 1);
$westZnoe = "GMT" . ($znoe);
} else {
//判断该时区是否在用夏令时时间
$westZnoe = "GMT" . ($znoe);
}
}
$time_znoe = !empty($eastZnoe) ? $eastZnoe : $westZnoe;
return $time_znoe;
}
根据时区计算时间
/**
* 根据当地时区计算当地时间
* @param string $znoe 时区 west8 east8
* @param int $summer_znoe 夏令时
*/
function time_znoe($znoe, $summer_znoe)
{
date_default_timezone_set("Asia/Shanghai");
$beijingTiem = date("H:i");
$beijingTiem = str_replace(":", '.', $beijingTiem);
$znoeName = substr($znoe, 0, 4);
$znonNum = substr($znoe, 4);
if ($znoeName == 'west') {//西区
//计算时区时间
//计算的区时=已知区时-(已知区时的时区-要计算区时的时区)(注:东时区为正,西时区为负)
//北京东八区 8 东区为正 西区为负
$new_znoe = $beijingTiem - (8 - (-$znonNum));
if ($new_znoe < 0) {//(注:当算出的区时为负数时,应加上24:00,日期减一天,如5月1日变为4月30日)
$new_znoe = $new_znoe + 24;
$znoeTime = date("Y-m-d", strtotime("-1 day"));
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$znoeTime = date("Y-m-d");
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
} else if ($new_znoe >= 24) {//大于24 //(注:当算出的区时大于或等于24:00时,应减去24:00,日期加一天,如5月1日变为5月2日)。
$new_znoe = $new_znoe - 24;
$znoeTime = date("Y-m-d", strtotime("+1 day"));
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
} else {//当天时间段
$znoeTime = date("Y-m-d");
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
}
$week = Date("w", strtotime($znoeTime));
return array('date' => $znoeTime, 'time' => $new_znoe, 'week' => $week);
}
if ($znoeName == 'east') {//东区
//计算时区时间
//计算的区时=已知区时-(已知区时的时区-要计算区时的时区)(注:东时区为正,西时区为负)
//北京东八区 8 东区为正 西区为负
$new_znoe = $beijingTiem - (8 - ($znonNum));
if ($new_znoe < 0) {//(注:当算出的区时为负数时,应加上24:00,日期减一天,如5月1日变为4月30日)
$new_znoe = $new_znoe + 24;
$znoeTime = date("Y-m-d", strtotime("-1 day"));
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$znoeTime = date("Y-m-d");
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
} else if ($new_znoe >= 24) {//大于24 //(注:当算出的区时大于或等于24:00时,应减去24:00,日期加一天,如5月1日变为5月2日)。
$new_znoe = $new_znoe - 24;
$znoeTime = date("Y-m-d", strtotime("+1 day"));
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
} else {//当天时间段
$znoeTime = date("Y-m-d");
if (strtotime($znoeTime) >= strtotime(start_summer_znoe()) || strtotime($znoeTime) <= strtotime(end_summer_znoe())) {
if ($summer_znoe) {
$new_znoe++;
}
}
//当加上夏令时大于二十四小时了
if ($new_znoe > 24) {
$hous = explode('.', $new_znoe);
$new_znoe = "00." . $hous[1];
}
// return array('date' => $znoeTime, 'time' => $new_znoe);
}
$week = Date("w", strtotime($znoeTime));
return array('date' => $znoeTime, 'time' => $new_znoe, 'week' => $week);
}
}