PHP的时差?

时间:2013-08-21 13:39:37

标签: php html forms

我正在尝试创建一个简单的应用程序,允许用户搜索两个位置,并向他们显示两个位置的时差。

我可以使用下面的代码获取两个位置Offset,但我无法将其连接到表单输入,以便用户可以选择位置!

这是我到目前为止所做的:

 <form id="form1" name="form1" method="post" action="<?php $get_timezone_offset ?>">
  <label>
    <input type="text" class="timezone1"  id="timezone1" name="timezone1" id="timezone1" />
    <input type="text" class="timezone2"  id="timezone2" name="timezone2" id="timezone2" />
    <input name="" type="button" value="submit" />
  </label>
</form>

    <?php
    function get_timezone_offset( $origin_tz, $remote_tz ) {
        $timezone1 = new DateTimeZone( $origin_tz );
        $timezone2 = new DateTimeZone( $remote_tz );

        $datetime1 = new DateTime("now", $timezone1);
        $datetime2 = new DateTime("now", $timezone2);

        $offset = $timezone1->getOffset($datetime1) - $timezone2->getOffset($datetime2);
        return $offset;
    }

    $offset = get_timezone_offset( 'Europe/London', 'Asia/Shanghai' );

    // convert offset to hours
    echo $offset/3600;
    ?>

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

试试这个

**`Set the default timezone`**

您可以通过两种方式设置默认时区:我们假设“欧洲/巴黎”是您要设置的时区:

Open your **`php.ini`** file in your favourite text editor and change the following line: **`date.timezone = Europe/Paris.`** You may have to restart your server in order to make this effective.
In case you don't want to meddle with your ini file you can simply set the default time zone using the following PHP function:

<?php date_default_timezone_set('Europe/Paris') ?>

List of PHP supported Timezones 更新您的时区

您的php安装使用PECL上提供的timezonedb软件包。

您可以通过以下方式检查timezonedb的当前版本:

<?php echo timezone_version_get() ?>

你会看到一个类似2012.9的数字,它对应于一个日期。有时候时区会更新,如果包裹超过一年,我建议你更新你的timezonedb。您可以通过在终端上执行以下命令来安装/更新timezonedb版本:

**$ sudo pecl install timezonedb**

不要忘记将新扩展名添加到php.ini,然后重新启动服务器以使其生效。

<强> extension=timezonedb.so * Get the User Timezone * 让用户选择它

使用上述功能,您可以按大洲列出所有时区。然后,您可以为每个国家/地区创建大陆和选项的下拉菜单。

<?php

function timezone_options()
{
    $zones = array(
        'Africa', 'America', 'Antarctica', 'Arctic', 'Asia',
        'Atlantatic', 'Australia', 'Europe', 'Indian', 'Pacific'
    );

    $list = timezone_identifiers_list();
    foreach ($list as $zone) {
        list($zone, $country) = explode('/', $zone);
        if (in_array($zone, $zones) && isset($country) != '') {
            $countryStr = str_replace('_', ' ', $country);
            $locations[$zone][$zone.'/'.$country] = $countryStr;
        }
    }

    return $locations;
}

<强> Get it via Javascript and PHP

Time zone are written as offset from UTC in the format **±[hh]:[mm], ±[hh][mm], or ±[hh].** So if the time being described is one hour ahead of UTC (such as the time in Berlin during the winter), the zone designator would be "**+01:00", "+0100", or simply "+01".**

您无法通过Php直接访问用户时区。要获得用户时区,您必须获得其偏移并知道是否观察到保存日光。您可以使用JavaScript获取此信息:

function get_timezone_infos() {
    var now = new Date();
    var jan1 = new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
    var temp = jan1.toGMTString();
    var jan2 = new Date(temp.substring(0, temp.lastIndexOf(' ') - 1));
    var offset = (jan1 - jan2) / (1000);

    var june1 = new Date(now.getFullYear(), 6, 1, 0, 0, 0, 0);
    temp = june1.toGMTString();
    var june2 = new Date(temp.substring(0, temp.lastIndexOf(' ') - 1));
    var dst = offset != ((june1 - june2) / (1000));

    return { offset: offset, dst: dst };
}

数据库存储

首先,将日期存储在数据库中并不困难。我最喜欢的选择是MySQL dateTime字段,您可以在一个字段中存储日期和时间。 对于DateTime类型的所有列,必须以UTC时区存储DateTime。

将DateTime时区设置为UTC,然后将其存储在数据库中:

<?php

function toDatabase($dateTime)
{
    $dateTime->setTimezone(new DateTimeZone('GMT'));
    return $dateTime;
}

从数据库中检索DateTime时,将其设置为原始时区:

<?php

// set the timezone of the current user before calling the function
date_default_timezone_set('Europe/Paris');

<?php

function toUser($dateTime)
{
    $dateTime->setTimezone(new DateTimeZone(date_default_timezone_get()));
    return $dateTime;
}

答案 1 :(得分:0)

您可以轻松删除输入并将其替换为所有可用时区的下拉列表。 official PHP documentation中提供了PHP支持的时区列表。然后,您可以直接比较一个列表中的值到另一个列表。

此外,请参阅Generating a drop down list of timezones with PHP,其中有人为您制作了该列表。

DateTimeZone::listIdentifiers(DateTimeZone::ALL);还会创建一个可用时区列表。