我想知道是否有办法在给定的持续时间内获得两个时区之间的给定日期范围的时区偏移量。
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+),DateTimeZone类是php核心的一部分,它将允许您使用getOffset()
函数进行这些计算。它将允许您传入dateTime对象并指定时区。如果你在两次约会中都这样做,你应该能够计算出你想要抓住的所有部分。使用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));
这对我有用:
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');
来源:http://php.net/manual/en/function.timezone-offset-get.php
我认为PHP的DateTimeZone::getTransitions
方法可以帮助您实现这一目标。它有一个过程别名timezone_transitions_get()
。
public array DateTimeZone::getTransitions (
[ int $timestamp_begin [, int $timestamp_end ]] )
此方法返回给定时间范围内该时区从一个时区偏移值到另一个时区的所有"转换"。
出于您的目的,您将希望为每个时区创建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)
}
转换数组的格式没有很好的文档记录。方法文档显示了一些示例条目:
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()
返回的以epoch秒为单位的PHP时间戳,给出了偏移量更改为该记录中值的时刻。time
指的是同一时刻,作为格式化的字符串日期时间。offset
是时区从UTC到下一个转换的偏移量(以秒为单位),从time
/ts
开始。如果偏移是指夏令时偏移,则isdst
为1,否则为0。abbr
是时区的字符串缩写。如果有人有关于这个数据结构的可靠信息,将其添加到文档中是一件好事。