1

我对网站有一点想法,要解决的主要问题是:

当访问者来到该站点时,它必须知道早上 8 点是世界上的哪个地方。

我们总是在某个地方询问“现在几点”。

以编程方式(例如 PHP)。我们如何作为反题?

提前致谢。

4

3 回答 3

2

您需要从时区列表开始,您可以从中获取:

DateTimeZone::listIdentifiers(DateTimeZone::ALL)

然后遍历列表,获取每个区域的当前时间。

如果时间在您要查找的范围内,则将该区域添加到要返回的值列表中。这将是一个范围——你不能只说“8:00 在哪里”——因为击中鼻子上的那个标记会非常困难。您可以改为说“它在哪里大于或等于 8:00 且小于 9:00”。

这是一段相当大的代码,您应该自己编写。我给了你起点和逻辑。我想你可以从那里拿走它。

于 2013-08-18T23:15:40.553 回答
0

也许这可以帮助某人。我需要在每天 17:00-19:00 之间发送一封电子邮件,具体取决于用户所在的国家/地区,这是通过注册表获得的。我最终只为每个用户提供了一个由两个字母组成的国家/地区代码。(我的客户对所有美国用户暂时都拥有相同的时区感到满意。)环顾四周后,我得到了以下结果:

  1. 一个以 UTC 偏移量为键的数组,以及一个由两个字母组成的国家代码数组。

    $timezones_countries = array(
    '0' => array(
        'BF', // Burkina Faso
        'CI', // Côte d'Ivoire
        'DK', // Denmark,
        'ES', // Spain
        'GM', // Gambia
        'GH', // Ghana
        'GN', // Guinea
        'GW', // Guinea-Bissau
        'IS', // Iceland
        'IE', // Ireland
        'LR', // Liberia
        'MA', // Morocco
        'ML', // Mali
        'MR', // Mauritania
        'PT', // Portugal
        'SN', // Senegal
        'SL', // Sierra Leone
        'ST', // São Tomé and Príncipe
        'TG', // Togo
        'UK'  // United Kingdom
    ),
    '1' => array(
        'AD', // Andorra
        'AL', // Albania
        'AO', // Angola
        'AT', // Austria
        'BA', // Bosnia and Herzegovina
        'BE', // Belgium
        'BJ', // Benin
        'CF', // Central African Republic
        'CG', // Congo
        'CH', // Switzerland
        'CM', // Cameroon
        'CZ', // Czech Republic
        'DE', // Deutschland
        'DZ', // Algeria
        'FR', // France
        'GA', // Gabon
        'GQ', // Equatorial Guinea
        'HR', // Croatia
        'HU', // Hungary
        'IT', // Italy
        'LI', // Lichtenstein
        'LU', // Lucembourg
        'MC', // Monaco
        'ME', // Montenegro
        'MK', // Macedonia
        'MT', // Malta
        'NA', // Namibia
        'NE', // Niger
        'NG', // Nigeria
        'NO', // Norway
        'PL', // Poland
        'SE', // Sweden
        'SI', // Slovenia
        'SK', // Slovakia
        'SM', // San Marino
        'RS', // Serbia
        'TD', // Chad
        'TN', // Tunisia
        'VA'  // Vatican City
    ),
    '2' => array(
        'BG', // Bulgaria
        'BI', // Burundi
        'BW', // Botswana
        'CY', // Cyprus
        'EE', // Estonia
        'EG', // Egypt
        'GR', // Greece
        'FI', // Finland
        'IL', // Israel
        'JO', // Jordan
        'LB', // Lebanon
        'LS', // Lesotho
        'LT', // Lithuania
        'LV', // Latvia
        'LY', // Lybia
        'MD', // Moldova
        'MW', // Malawi
        'MZ', // Mozambique
        'RO', // Romania
        'RW', // Rwanda
        'SY', // Syria
        'SZ', // Swaziland
        'TR', // Turkey
        'UA', // Ukraine
        'ZA', // South Africa
        'ZM', // Zambia
        'ZW', // Zimbabwe
    ),
    '3' => array(
        'BH', // Bahrain
        'BY', // Belarus
        'DJ', // Djibouti
        'ER', // Eritrea
        'ET', // Ethiopia
        'IQ', // Iraq
        'KE', // Kenya
        'KW', // Kuwait
        'KM', // Comoros
        'MG', // Madagascar
        'QA', // Qatar
        'SA', // Saudi Arabia
        'SD', // Sudan
        'SO', // Somalia
        'SS', // South Sudan
        'TZ', // Tanzania
        'UG', // Uganda
        'YE'  // Yemen
    ),
    '4' => array(
        'AE', // United Arab Emirates
        'AM', // Armenia
        'AZ', // Azerbaijan
        'GE', // Georgia
        'IR', // Iran
        'MU', // Mauritius
        'OM', // Oman
        'RU', // Russia
        'SC', // Seychelles
    ),
    '5' => array(
        'AF', // Afghanistan
        'KZ', // Kazakhstan
        'MV', // Maldives
        'PK', // Pakistan
        'TJ', // Tajikistan
        'TM', // Turkmenistan
        'UZ'  // Uzbekistan
    ),
    '6' => array(
        'BD', // Bangladesh
        'BT', // Bhutan
        'IN', // India
        'LK', // Sri Lanka
        'KG', // Kyrgyzstan
        'NP', // Nepal
    ),
    '7' => array(
        'ID', // Indonesia
        'KH', // Cambodia
        'LA', // Laos
        'MM', // Myanmar
        'TH', // Thailand
        'VN'  // Vietnam
    ),
    '8' => array(
        'BN', // Brunei
        'CN', // China
        'MN', // Mongolia
        'MY', // Malaysia
        'PH', // Philippines
        'SG', // Singapore
        'TW'  // Taiwan
    ),
    '9' => array(
        'JP', // Japan
        'KP', // North Korea
        'KR', // South Korea
        'PW', // Palau
        'TP'  // East Timor
    ),
    '10' => array(
        'AU', // Australia
        'FM', // Federated States of Micronesia
        'MP', // Northern Mariana Islands
        'PG'  // Papua New Guinea
    ),
    '11' => array(
        'SB', // Solomon Islands
        'VU'  // Vanuatu
    ),
    '12' => array(
        'FJ', // Fiji
        'KI', // Kiribati
        'MH', // Marshall Islands
        'NF', // Norfolk Island
        'NR', // Nauru
        'NZ', // New Zealand
        'TV'  // Tuvalu
    ),
    '13' => array(
        'TO', // Tonga
        'WS'  // Samoa
    
    ),
    '-12' => array(),
    '-11' => array(
        'AS', // American Samoa
        'NU'  // Niue
    ),
    '-10' => array(
        'PF'  // French Polynesia
    ),
    '-9' => array(),
    '-8' => array(),
    '-7' => array(),
    '-6' => array(
        'BZ', // Belize
        'CR', // Costa Rica
        'GT', // Guatemala
        'HN', // Honduras
        'MX', // Mexico
        'NI', // Nicaragua
        'SV'  // El Salvador
    ),
    '-5' => array(
        'BS', // Bahamas
        'CA', // Canada
        'CO', // Colombia
        'CU', // Cuba
        'EC', // Ecuador
        'HT', // Haiti
        'JM', // Jamaica
        'KY', // Cayman Islands
        'PA', // Panama
        'PE', // Peru
        'TC', // Turks and Caicos Islands
        'US'  // United States
    ),
    '-4' => array(
        'AG', // Antigua and Barbuda
        'AW', // Aruba
        'BB', // Barbados
        'BM', // Bermuda
        'BO', // Bolivia
        'CL', // Chile
        'DM', // Dominica
        'DO', // Dominican Republic
        'GD', // Grenada
        'GP', // Guadeloupe
        'GY', // Guyana
        'KN', // Saint Kitts and Nevis
        'LC', // Saint Lucia
        'MQ', // Martinique
        'MS', // Montserrat
        'PR', // Puerto Rico
        'PY', // Paraguay
        'TT', // Trinidad and Tobago
        'VC', // Saint Vincent and the Grenadines
        'VE', // Venezuela
        'VG', // British Virgin Islands
        'VI'  // US Virgin Islands
    ),
    
        '-3' => array(
        'AR', // Argentina
        'BR', // Brazil
        'FK', // Falkland Islands
        'GL', // Greenland
        'GF', // French Guiana
        'SR', // Suriname
        'UY'  // Uruguay
    ),
    '-2' => array(
        'GS'  // South Georgia and the South Sandwich Islands
    ),
    '-1' => array(
        'CV'  // Cape Verde
    ));
    
  2. 一个返回国家数组(如果有的话)的函数,它现在在 17:00 和 19:00 之间。服务器时间为 UTC。我确信它可以提高效率(建议,有人吗?:))。

    function getTimezoneCountryCodes() {
        $offset = -12;
        $server_time = time();
        $countries = null;
        //echo 'UTC: '.date('Y-m-d H:i:s',$server_time)."\n";
        while($offset < 12) {
            $delta_time = $offset * 3600;
            $trigger_time = $server_time + $delta_time;
            $hour = date('H', $trigger_time);
            if($hour == 17) {
                global $timezones_countries;
                $result = array(
                    'time'      => $trigger_time,
                    'countries' => $timezones_countries[strval($offset)]
                );
                return $result;
            }
            $offset++;
        }
    }
    $timezone = getTimezoneCountryCodes();
    

如果您需要每个国家/地区的精确度,您将需要更彻底的方法。

干杯

于 2014-05-08T16:14:42.733 回答
0

您可以使用当地时间,例如在法国这里是 20:30。时区当前是夏季的 UTC 或 GMT+2。

您需要一张将每个时区与位置相关联的地图,并在+2 - 12此处获取时区(因为上午 8 点的位置有 12 小时的偏移量)。因此,您需要显示时区为 GMT-10 的每个国家/城市。

有一些情况需要解决,例如澳大利亚有半个时区(即使是四分之一!如果我记得的话,UTC +8:45),但想法就在这里。

如果你想要一个简单的算法,不要考虑分钟,因为如果你采用一个简单的方案,每个时区都是全时,你将有一个区域,只有当每个时钟在世界在:00 :-)

于 2013-08-18T18:32:54.747 回答