当前位置: 首页 > 面试题库 >

将UTC偏移量转换为时区或日期

姜磊
2023-03-14
问题内容

为您准备的头抓板。

我正在从IPInfoDB的API中获取地理IP数据,它从UTC返回 包括 DST
的时区偏移(如果当前已反映)。

例如,我住在EST(-5),目前是DST,因此geo IP API返回(-04:00)作为偏移量。

因为DST令人头疼,所以这太好了。但是令我惊讶的是,它又引起了头疼。

我将此数据加载到PHP中,以通过AJAX传递给应用程序。我想在应用程序上获取IP地址的实时本地时间。

我已经将所有设置都完美地设置了,但是我很疯狂地试图找出如何设置PHP时区以匹配偏移量,这样我就可以抓住当前的小时date('H');和分钟date('i');来通过AJAX传递给。

我不确定是否有特定功能可以根据该偏移量提供当前的小时和分钟,或者是否存在基于偏移量设置时区的实用方法(如果已经生效,则已经应用了DST) 。

我一直在搜索Google,以找到答案,但是由于DST已应用,因此我的操作更为具体。

我在PHP.net上发现了一个似乎可以解决问题的函数(它适用于我的时区并返回正确的时间),尽管对于其他时区(例如PST),即使偏移量是正确的,它也会比原应晚1小时返回(-07:00DST)。

Chile/EasterIsland我感觉是从函数返回的时区是原因。如果可以的话,我只能在美国使用,但确实需要在全球范围内使用。

这是我现在拥有的功能。请原谅非常混乱的代码。在过去的几个小时中,我一直在忙于处理很多事情,以寻求解决方案。

大多数功能是在网上找到的。

function offsetToTZ($offset) {
switch((string) $offset) {
    case '-04:30' : return 'America/Caracas'; break;
    case '-03:30' : return 'Canada/Newfoundland'; break;
    case '+03:30' : return 'Asia/Tehran'; break;
    case '+04:30' : return 'Asia/Kabul'; break;
    case '+05:30' : return 'Asia/Kolkata'; break;
    case '+05:45' : return 'Asia/Kathmandu'; break;
    case '+09:30' : return 'Australia/Darwin'; break;
}
$offset = (int) str_replace(array('0',0,':00',00,'30',30,'45',45,':','+'),'', (string) $offset);

$offset = $offset*60*60;
$abbrarray = timezone_abbreviations_list(); 
foreach ($abbrarray as $abbr) { 
    foreach($abbr as $city) { 
        if($city['offset'] == $offset) { 
            return $city['timezone_id'];
        }
    }
}
return false; 
}

我包括用于某些时区是开关/壳体:30:45在那里。可能有一种方法也可以包括在内,而无需开关/外壳。

注意: 偏移量总是这样返回+00:00-00:00从geo IP API返回。

我将不胜感激,也为您提供了正确的指导。我不是PHP的新手,但抵消对我来说是个新故事。谢谢!


问题答案:

只需将偏移量转换为秒数并将其传递给timezone_name_from_abbr

<?php
$offset = '-7:00';

// Calculate seconds from offset
list($hours, $minutes) = explode(':', $offset);
$seconds = $hours * 60 * 60 + $minutes * 60;
// Get timezone name from seconds
$tz = timezone_name_from_abbr('', $seconds, 1);
// Workaround for bug #44780
if($tz === false) $tz = timezone_name_from_abbr('', $seconds, 0);
// Set timezone
date_default_timezone_set($tz);

echo $tz . ': ' . date('r');

演示版

第三个参数timezone_name_from_abbr控制是否调整夏令时。

错误#44780:

timezone_name_from_abbr()在某些时区偏移量上将返回false。特别是-夏威夷,与格林尼治标准时间偏移为-10,-36000秒。



 类似资料:
  • 我有一个格式为“2019-04-25T16:34:28-05:00”的字符串。我已经通过模式“yyyy-mm-dd't'hh:mm:ssz”通过joda-time解析了字符串。 它在DateTime中给出的输出是“2019-04-25t15:34:28.000-06:00”。

  • 我需要将查询中的日期值转换为带有时区的时间戳,但目前我得到的时区区域(“欧洲/巴黎”)是EF使用的无效区域。 例如,在执行此操作时:

  • 问题内容: 给定以下字符串:如何将其转换为对象? 阅读后,我觉得这应该可以,但是不行。 应该注意的是,这没有问题: 但是我坚持下去。我宁愿完全转换它,而不以任何方式更改(或切片)它。 问题答案: 看起来strptime并不总是支持。Python似乎只是调用C函数,而您平台上不支持strptime 。 注意: 从Python 3.2开始,它将始终有效。

  • 我试图弄清楚如何将LocalDateTime转换为偏移量为0的Date对象。 我使用的将LocalDateTime转换为日期的当前代码是: LocalDateTime: 转换到日期后: 是的,我看到有一个区域偏移量被传递到Instant中,但我不确定如何做我所要求的。

  • 问题内容: 我从我的API获取此日期字符串: 但是此日期为UTC格式,我想将其转换为当地时间,该怎么办? 我尝试了这个: 但是它返回了这个错误: 问题答案: 您的日期格式模式错误。改成: 有关更多信息,请参见SimpleDateFormat的javadoc。

  • 总之,下面的当前日期代码段给出了以下结果: <代码>2019-11-20T18:02:57.568Z 有没有一种自动的方法来完成这种转换?或者是npm软件包。