Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取给定持续时间内两个时区之间的时区偏移量_Php_Mysql_Datetime_Timezone_Datetimeoffset - Fatal编程技术网

Php 获取给定持续时间内两个时区之间的时区偏移量

Php 获取给定持续时间内两个时区之间的时区偏移量,php,mysql,datetime,timezone,datetimeoffset,Php,Mysql,Datetime,Timezone,Datetimeoffset,我想知道是否有一种方法可以获得给定时间内两个时区之间给定日期范围的时区偏移量 getTimezoneOffset(startDate,endDate,timezone1,timezone2){ ...missing magic to go here... } 应返回在给定持续时间内有效的时区偏移量。但是,如果偏移量发生更改,则应返回其有效的日期范围 所以我在看这样的东西: getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC

我想知道是否有一种方法可以获得给定时间内两个时区之间给定日期范围的时区偏移量

getTimezoneOffset(startDate,endDate,timezone1,timezone2){
    ...missing magic to go here...
}
应返回在给定持续时间内有效的时区偏移量。但是,如果偏移量发生更改,则应返回其有效的日期范围

所以我在看这样的东西:

getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC", "US/NEW_YORK")
返回值如下所示

timezoneoffset[0]["range"]=[march 9 12am to march 11 2 am]
timezoneoffset[0]["offset"]=5
timezoneoffset[1]["range"]=[march 9 2 am to march 15 12 am]
timezoneoffset[1]["offset"]=4
我只是不想计算给定范围内每个计划项目的时区偏移量。如果偏移量将发生变化,我们正在寻找是否有某种方法可以直接查找偏移量

我正在使用PHP,但任何语言的解决方案都将受到欢迎


MySQL解决方案也将起作用,因为它将在MySQL中进行更优化。

假设您有一个更新版本的php(5.2.0+)该类是php核心的一部分,并允许您使用
getOffset()
函数进行这些计算。它将允许您传入并指定时区。如果你在两次约会中都这样做,你应该能够计算出你想要抓住的所有片段。要使用php.net中的示例,请执行以下操作:

// Create two timezone objects, one for Taipei (Taiwan) and one for
// Tokyo (Japan)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");

// Create two DateTime objects that will contain the same Unix timestamp, but
// have different timezones attached to them.
$dateTimeTaipei = new DateTime(mktime([the date in question]), $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime(mktime([the date in question]), $dateTimeZoneJapan);


// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei
// object, but using the timezone rules as defined for Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST).
print("Number of seconds Japan is ahead of GMT at the specific time: ");
var_dump($timeOffset);

print("<br />Number of seconds Taipei is ahead of GMT at the specific time: ");
var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei));

print("<br />Number of seconds Japan is ahead of Taipei at the specific time: ");
var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei)
     -$dateTimeZoneTaipei->getOffset($dateTimeTaipei));
//创建两个时区对象,一个用于台北(台湾),一个用于
//东京(日本)
$DateTimeZoneTapei=新的日期时区(“亚洲/台北”);
$dateTimeZoneJapan=新的日期时区(“亚洲/东京”);
//创建两个DateTime对象,它们将包含相同的Unix时间戳,但
//有不同的时区连接到它们。
$dateTimeTaipei=新的日期时间(mktime([相关日期]),$dateTimeZoneTaipei);
$dateTimeJapan=新的日期时间(mktime([相关日期]),$dateTimeZoneJapan);
//计算$DateTimeTaiple中包含的日期/时间的GMT偏移量
//对象,但使用为东京定义的时区规则
//($dateTimeZoneJapan)。
$timeOffset=$dateTimeZoneJapan->getOffset($dateTimeTaipei);
//应显示int(32400)(适用于1951年9月8日星期六01:00:00之后的日期)。
打印(“日本在特定时间领先GMT的秒数:”);
变量转储($timeOffset);
打印(
台北在特定时间比格林尼治标准时间提前的秒数:); 变量转储($dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 打印(
日本在特定时间领先台北的秒数:); 变量转储($dateTimeZoneJapan->getOffset($dateTimeTaipei) -$dateTimeZoneTaipei->getOffset($dateTimeTaipei));
我认为PHP可以帮助您实现这一目标。它有一个过程别名,
timezone\u transitions\u get()

此方法返回给定时间范围内从一个时区偏移值到另一个时区偏移值的所有“转换”

出于您的目的,您需要为每个时区创建
DateTimeZone
对象,为您的日期范围调用
DateTimeZone::getTransitions
,以获取该时区的转换数组,然后合并并排序两个转换数组。这将为您提供所需的
timezoneoffset[]
数组的等效值

比如:

getTimezoneOffset(startDate,endDate,timezone1,timezone2){
    DT1 = DateTimeZone( timezone1 );
    transitions1 = DT1->getTransitions( startDate,endDate );
    DT2 = DateTimeZone( timezone2 );
    transitions1 = DT2->getTransitions( startDate,endDate );
    timezoneoffset[] = // merge and sort (transitions1, transitions2)
}
transitions数组的格式没有很好的文档记录。方法文档显示了一些示例条目:

Array
(
...
    [1] => Array
        (
            [ts] => -1691964000
            [time] => 1916-05-21T02:00:00+0000
            [offset] => 3600
            [isdst] => 1
            [abbr] => BST
        )

    [2] => Array
        (
            [ts] => -1680472800
            [time] => 1916-10-01T02:00:00+0000
            [offset] => 0
            [isdst] => 
            [abbr] => GMT
        )
    ...
)
我推测:
ts
指由
time()
返回的以历元秒为单位的PHP时间戳,给出偏移量更改为该记录中的值的时间瞬间<代码>时间指的是与格式化字符串日期时间相同的瞬间
offset
是时区从UTC开始的偏移量,以秒为单位,从瞬间
时间
/
ts
向前到下一个转换<如果偏移量指夏令时偏移量,则代码>isdst为1,否则为0
abbr
是时区的字符串缩写。如果有人有关于此数据结构的可靠信息,请将其添加到中。

这对我有用:

function Get_Timezone_Offset($remote_tz, $origin_tz = null) 
{
    if($origin_tz === null) 
    {
        if(!is_string($origin_tz = date_default_timezone_get())) {
            return false;
        }
    }
    $origin_dtz = new DateTimeZone($origin_tz);
    $remote_dtz = new DateTimeZone($remote_tz);
    $origin_dt  = new DateTime("now", $origin_dtz);
    $remote_dt  = new DateTime("now", $remote_dtz);
    $offset     = $origin_dtz->getOffset($origin_dt) - $remote_dtz->getOffset($remote_dt);
    return $offset;
}
使用它

echo Get_Timezone_Offset('America/New_York', 'Europe/Stockholm');
资料来源:

我知道获取偏移量..但是获取偏移量只会给你给定时间的偏移量..问题是我有一个时间表,其中包含一天中不同时间的日程项目计划..因此,如果我在2012年3月10日晚上9点到3月11日上午9点之间收到获取日程项目的请求,偏移量将随时间而变化..我不需要计算每一次的补偿…这只是为了我们…不同的国家会有不同的补偿变化的日子,。。我试图找到两个时区之间的偏移量,一组时间不一定是UTC。问题是我不知道,如果我根据开始时间计算偏移量,它在整个过程中都是相同的。我认为PHP get offset GGU为给定时间的偏移量提供了偏移量。我希望我自己弄清楚底线是,我必须假设偏移量可能会变化在一天中,比如说3月11日上午12点到3月11日下午12点(偏移量在凌晨2点变化)…我试图覆盖这个角落案例GetOffset只会给你指定时间的偏移量,但每次计算它有什么不好?指定开始日期时间和结束日期时间。。。计算出开始时间的偏移量和结束时间的偏移量,如果不同,则将差异考虑在内。。。基于
getOffset
编写函数
getTimezoneOffset(startDate、endDate、timezone1、timezone2)
应该不会那么难。我一直在寻找的是,你不知道偏移量何时更改getTransitions!在给定的持续时间内,偏移量可以改变不止一次,所以开始时间的偏移量可能等于结束时间的偏移量,但这确实保证了偏移量在给定的持续时间内保持不变,而且我想知道在给定的持续时间内,偏移量什么时候会改变!谢谢Jim..这正是我想要的..我浏览了datetime对象,但这被忽略了。谢谢@Mohamad Hamouday。这部分代码对我很有用。
echo Get_Timezone_Offset('America/New_York', 'Europe/Stockholm');