【问题标题】:Datetime to Timestamp in milliseconds in PHPPHP中的日期时间到时间戳(以毫秒为单位)
【发布时间】:2016-07-07 12:15:02
【问题描述】:

我想从输入“2016-03-22 14:30”创建一个以毫秒为单位的时间戳。 指定的时区也应该是澳大利亚/悉尼。

我尝试了不同的方法,但似乎都没有奏效。

谁能帮帮我?我真的很挣扎。

【问题讨论】:

  • 发布您尝试过的一些代码以及为什么它们不起作用。编辑问题,不在 cmets 中。

标签: php timestamp milliseconds


【解决方案1】:

相当自我解释的代码,所以我不会多说。

date_default_timezone_set('Australia/Sydney'); // set timezone
$yourdate = '2016-03-22 14:30';
$stamp = strtotime($yourdate); // get unix timestamp
$time_in_ms = $stamp*1000;

如果要正常显示的话。

echo number_format($time_in_ms, 0, '.', '');

【讨论】:

  • 你错过了 - 以毫秒为单位 我猜。
  • 只是乘以 1000,但除非您要与另一个日期进行比较,否则为什么要将日期转换为毫秒并没有什么意义。因为这只会返回自 1970 年以来经过的毫秒数
  • @KyleK 他可能需要这种方式来连接一个只接受毫秒时间戳的 API,因为这正是我提出这个答案的原因
  • 这不是毫秒,这是秒*1000
【解决方案2】:

* 1000 的答案只是格式化输出,但不捕获精度。

DateTime->format,其中U 表示秒,u 表示微秒,v 表示毫秒:

<?php
// pass down `now` or a saved timestamp like `2021-06-15 01:03:35.678652`
$now = new \DateTime('now', new \DateTimeZone('UTC'));
// or something like:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''), new \DateTimeZone('UTC'));

// in microseconds:
$now_us = (int)$now->format('Uu');
// e.g.: 1623719015678652


// in milliseconds:
$now_ms = (int)$now->format('Uv');
// e.g.: 1623719015678

【讨论】:

    【解决方案3】:

    试试这个就行了

    <?php
    $date = new DateTime('@'.strtotime('2016-03-22 14:30'), new DateTimeZone('Australia/Sydney'));
    
    echo "Timestamp in Australia/Sydney: ".$date->format('Y-m-d H:i:sP');
    echo "<br/>";
    echo "Timestamp in miliseconds Australia/Sydney: ".strtotime($date->format('Y-m-d H:i:sP'));
    ?>
    

    输出:

    Timestamp in Australia/Sydney: 2016-03-22 18:30:00+00:00
    Timestamp in miliseconds Australia/Sydney: 1458671400
    

    【讨论】:

    • 嗨 Rohit,很遗憾,它不起作用。我想从输入“2016-03-22 14:30”创建一个以毫秒为单位的时间,以将其作为任务的一部分发布到Onfleet。正如Onfleet Data Types page 上所写,他们使用的时间戳“以 Unix 纪元时间格式使用和生成,精度为毫秒”。传递时间戳时,我收到一条消息,指出时间戳无效。
    • @Hyacinthe 你得到什么输出?
    • 你试过这个时间戳 1458671400 吗?因为 Unix 纪元时间格式与普通的 unix 时间戳相同。
    • 请测试它,如果它不起作用,请给我任何时间戳示例。
    【解决方案4】:
    date_default_timezone_set("Australia/Sydney");
    echo strtotime('2016-03-22 14:30') * 1000;
    

    输出:1458617400000

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案5】:

    您可以使用DateTimecreateFromFormat 方法,或者更好的是DateTimeImmutable,同时将时区作为第三个参数传递。这样您就不需要依赖默认时区,这绝不是一个好主意

    $datetime = DateTimeImmutable::createFromFormat('Y-m-d H:i', '2016-03-22 14:30', new DateTimeZone('Australia/Sydney'));
    echo $datetime->getTimestamp();
    echo $datetime->format(DateTime::ISO8601);
    

    您也可以将其转换为另一个时区,注意它产生了新的 DateTimeImmutable 并且原始保持不变:

    echo $utcTzDatetime = $date->setTimezone(new DateTimeZone('UTC'));
    echo $utcTzDatetime->format(DateTime::ISO8601);
    echo $datetime->format(DateTime::ISO8601);
    

    更新:

    如果格式不固定,可以让DateTime猜测一下:

    new DateTimeImmutable($time, new DateTimeZone('Australia/Sydney'));
    

    但请注意,如果$time 字符串包含时区或偏移量,例如'2016-03-22T14:30-0500',它将优先于时区参数并导致不同的时间戳!

    【讨论】:

    • 这是 PHP 中的惯用方法
    【解决方案6】:

    对于那些寻找如何从 DateTime 获取时间戳(以毫秒为单位)的人来说,这是我想出的:

    $date = new DateTimeImmutable();
    
    $timestampMs = (int) ($date->getTimestamp() . $date->format('v'));
    

    这会以秒为单位获取时间戳并附加毫秒 ('v' format)。

    https://3v4l.org/UoZsL

    【讨论】:

      【解决方案7】:

      如果你使用的是 Carbon 包,那么你可以使用

      Carbon::parse('2009-09-22 16:47:08.128')->micro
      

      这将以微秒为单位返回您的时间。您可以将其除以 1000 并将其与同一日期的纪元时间戳(以秒为单位)连接。
      只需确保如果日期格式没有毫秒组件,那么您将得到 0 为微秒,并且您必须在连接之前用额外的零填充该 0。

      【讨论】:

        【解决方案8】:

        简单试试这个方法

        <?php
        $time = microtime(true);
        $datetime = new DateTime();
        $datetime->setTimestamp($time);
        $format = $datetime->format('Y-m-d H:i:s');
        var_dump($format);
        ?>
        

        【讨论】:

          猜你喜欢
          • 2016-09-06
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 2018-01-10
          • 2023-03-11
          • 2011-05-31
          • 2011-10-07
          • 1970-01-01
          相关资源
          最近更新 更多