PHP日期\太阳\信息错误时间

PHP日期\太阳\信息错误时间,php,time,Php,Time,我正在尝试使用PHP的date\u sun\u info函数获取一天中太阳某些位置的时间信息: 目前,我正在使用类似于中的代码 这显然是错误的 我不知道为什么会这样。任何帮助都将不胜感激 我原以为这和时区有关?如果是这样,我应该如何对此进行更正?服务器的时区设置为美国/纽约,比格林尼治标准时间晚5小时,但即使考虑到这一点,时间也不可能正确,除非我计算错误。我想你把数字弄错了40.42,74.0翻译为吉尔吉斯坦山脉中的一个点。你大概是指纽约的40.42,-74 至于为什么会发生这种情况,似乎函数确

我正在尝试使用PHP的
date\u sun\u info
函数获取一天中太阳某些位置的时间信息:

目前,我正在使用类似于中的代码

这显然是错误的

我不知道为什么会这样。任何帮助都将不胜感激


我原以为这和时区有关?如果是这样,我应该如何对此进行更正?服务器的时区设置为美国/纽约,比格林尼治标准时间晚5小时,但即使考虑到这一点,时间也不可能正确,除非我计算错误。

我想你把数字弄错了<代码>40.42,74.0翻译为吉尔吉斯坦山脉中的一个点。你大概是指纽约的
40.42,-74

至于为什么会发生这种情况,似乎函数确实是时区敏感的,但没有适当的文档记录:

  • 吉尔吉斯斯坦是格林尼治标准时间+6
  • 纽约是格林尼治标准时间5点
这相当于11个小时的差距


当时日出时间是当地时间7:50,纽约时间20:50

谢谢你的提问,我同意你选择@Pekka作为正确答案,但我有一个类似的问题,原因不同(你在问题中提到过),所以我想我会与大家分享

我发现,当使用与上面相同的脚本时,但是使用了一组不同的lat/long和时区,它的日出/日落和黄昏值被反转。这是因为默认值不正确。这可以在ini文件的
[Date]
部分找到,并且可以通过输入


大多数人(包括你自己)可能会注意到时区会马上关闭,因为存在明显的差异,但在我的辩护中,默认时区是“UTC”,而我要找的是“太平洋/奥克兰”,这正好相反(时区方面)。

正如@Pekka评论的那样,这个功能是时区敏感的,它可以让你疯狂一段时间,直到你发现

事实上,这个函数应该有一个额外的参数来传递时区,就像date\u sunrise/date\u sunset一样。无论如何,作为确保所有计算正确的解决方案,您必须始终这样做($时区是目标位置的tz,其中lat/long点):

结果是基于UTC的标准时间戳,您必须对结果应用$timezone以获得正确的(本地)日期和时间:

    $dsi_tz = new DateTimeZone($timezone);
    $sunrise = new DateTime("@" . $dsi['civil_twilight_begin']);
    $sunrise->setTimezone($dsi_tz);
    echo $sunrise->format('Y-m-d H:i:s e');
    $sunset = new DateTime("@" . $dsi['civil_twilight_end']);
    $sunset->setTimezone($dsi_tz);
    echo $sunset->format('Y-m-d H:i:s e');

处理时间戳和时区的经验法则是:所有时间戳必须始终以UTC为基础进行读取、存储和处理,并且时区必须仅在链的末端用于表示。弄乱有偏差的时间戳以使其成为本地或添加偏移量是一个相当令人头痛的问题。

在您的输出中,日出和日落时间看起来是颠倒的…我只是复制/粘贴了您的代码,看起来很好(当然,考虑到我们两个时区的差异),您是完全正确的。这就是我从谷歌的第一个网站上粘贴长/宽信息得到的!在某些情况下,可能还需要以UTC为单位获取本地日历日期的不同日光阶段。我一直想知道是否有一些标志允许这样使用
date\u sun\u info
,但似乎没有。我想出了一个办法。
sunrise: 20:50:20
sunset: 07:45:03
transit: 02:17:41
civil_twilight_begin: 20:22:45
civil_twilight_end: 08:12:38
nautical_twilight_begin: 19:51:01
nautical_twilight_end: 08:44:22
astronomical_twilight_begin: 19:19:28
astronomical_twilight_end: 09:15:55
    // push tz
    $tz = date_default_timezone_get();
    date_default_timezone_set($timezone);
    $dsi = date_sun_info($timestamp, $latitude, $longitude);
    // pop tz
    date_default_timezone_set($tz);
    $dsi_tz = new DateTimeZone($timezone);
    $sunrise = new DateTime("@" . $dsi['civil_twilight_begin']);
    $sunrise->setTimezone($dsi_tz);
    echo $sunrise->format('Y-m-d H:i:s e');
    $sunset = new DateTime("@" . $dsi['civil_twilight_end']);
    $sunset->setTimezone($dsi_tz);
    echo $sunset->format('Y-m-d H:i:s e');