【问题标题】:PHP DateTime from negative UNIX timestamp with milli/microsecondsPHP DateTime 来自负 UNIX 时间戳,毫秒/微秒
【发布时间】:2013-04-18 06:26:19
【问题描述】:

我想从负 UNIX 时间戳(1970 年之前)创建 PHP \DateTime 对象,微秒级,没有太多脏代码。

new \DateTime("@-100") 有效,但 new \DateTime("@-100.123") 无效。

\DateTime::createFromFormat("U u", "100 123456") 有效,但 \DateTime::createFromFormat("U u", "-100 123456") 无效。

并且 \DateInterval 当前没有微秒。

到目前为止,我发现创建此类 DateTime 的唯一方法是解析 new \DateTime("1969-12-31T23:59:59.877GMT") 之类的字符串,但我不喜欢 number->string->DateTime 链。有没有更明确的方法?

【问题讨论】:

    标签: php datetime timestamp


    【解决方案1】:

    在 x64 上工作的代码,用于微秒之间的转换,但我不太喜欢它。

    $ts_mks = -100000012345;
    
    $div = floor($ts_mks / 1000000);
    $mod = $ts_mks % 1000000;
    if($mod < 0) {
        $mod += 1000000;
    }
    
    $date_s = new \DateTime();
    $date_s->setTimestamp($div);
    $date_s->setTimezone(new \DateTimeZone("GMT"));
    $ts_str = $date_s->format("Y-m-d\\TH:i:s.") . sprintf("%06dZ", $mod);
    
    // result
    $date = \DateTime::createFromFormat("Y-m-d\\TH:i:s.ue", $ts_str);
    

    Mush 更短但更神秘(结合整数负秒和正小数部分):

    $date = new \DateTime(sprintf("@%d 00:00:00.%06d", $div, $mod));
    

    转换回来

    $ts_mks = $date->getTimestamp() * 1000000 + (int) $date->format("u");
    

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2021-08-06
      • 2019-08-01
      • 1970-01-01
      • 2018-06-25
      • 2021-11-20
      • 2013-06-22
      相关资源
      最近更新 更多