【问题标题】:PHP Turn back timePHP 时光倒流
【发布时间】:2010-09-27 00:15:28
【问题描述】:

我想将当前时间前 10 秒的时间倒回并以这种格式输出 date('H/i/s')

我该怎么做?

我不想获取当前时间然后从时间中删除 10 秒。

谢谢

【问题讨论】:

  • 出于什么原因,您不想从time() 之类的内容中扣除 10 秒?

标签: php datetime


【解决方案1】:
echo date('H/i/s', time()-10);

【讨论】:

  • 这个答案不再有效
  • 我认为用户编辑问题的意思是他们想要更改系统时间。
  • @NullUserException - 那他们为什么接受这个答案?我也很困惑;似乎这个答案正在做用户不想要的事情(从time()....中减去,顺便说一句,这似乎是正确的做法)....但他们接受了??
【解决方案2】:

我个人尽量避免直接使用 time() 值,因为在尝试添加或减去天/周/等时。闰年等。出于所有实际目的,strtotime() 始终可靠:

echo date('H/i/s', strtotime('-10 seconds', time())); // time() - 10 seconds

** 编辑 **

为什么time() - 10not good

<?php
// this is my timezone, but it applies to any DST zones....
date_default_timezone_set('America/Montreal');

$time = strtotime('2010-11-07 02:00:05');

var_dump(date(DATE_RFC822, $time - 10));
var_dump(date(DATE_RFC822, strtotime('-10 seconds', $time)));

这个输出是

string(29) "Sun, 07 Nov 10 01:59:55 -0500"
string(29) "Sun, 07 Nov 10 01:59:55 -0400"

请注意第二个示例中 UTC 的变化?如果它不完全正确,应该是Sun, 07 Nov 10 02:59:55 -0500 (请参阅here 将其重置回正确的UTC) 减去10 到time() 是最糟糕的!它会及时返回 1 小时的时间戳。这可能会导致潜在的数据错误等。

同样的事情也适用于加减日和月;直接操作time() 根本不是一个好主意,strtotime() 将始终为给定的时间操作返回正确的时间戳。期间。

【讨论】:

  • "值,由于尝试添加或减去闰年等天/周/等的原因" --- time() 只是自 unix 纪元以来的秒数,没有什么可做的与闰年等有关。不管闰年或其他任何事情,它都会单调增长。
  • 我知道,现在你得到echo $time - strtotime('-10 seconds', $time);。但只剩下 10 秒,而不是 3610。问题在于日期格式,而不是其计算。时间单调流逝,如果还剩 10 秒,则差为 10。如果没有 - 修复你的 date() 函数。
  • @zerkms, echo $time - strtotime('-10 seconds', $time); echo 3610 for me while echo $time - ($time - 10); echo 10... 后者是错误的(其中 $time 是“Sun, 07 Nov 10 02:00:05” 或 course )。问题不在于它在大多数情况下无关紧要,问题在于它在某些“不可预测”的情况下确实如此。
  • 时间戳是自 1970 年 1 月 1 日以来的秒数。它逐秒单调增长。如果还剩 10 秒,则时间戳相差 10。观点。 日期格式有问题。您的日期函数不知道夏季和非夏季时间 - 这就是您试图作弊的原因。
  • @zerkms,您可以随心所欲地证明,但直接操纵时间并不能保证在每个时区始终返回正确的时间戳。正如您所说,时间可能会单调递增,但事实的 DST 会发生时间变化,并且在该变化期间time() - 10 会产生不正确的时间戳,而strtotime('-10 seconds')始终 正确。你不会在这里赢。
【解决方案3】:

要更改系统时间,您需要调用操作系统的 API 来更改时间。在 Linux 上,您可以使用 date 命令执行此操作:

date MMDDhhmmYYYY.ss

例如,date 092619222010.30 会将日期和时间设置为 Sep 26 2010 19:22:30。在 PHP 上,您可以尝试使用 system()1 函数来做到这一点。

$stamp = date('mdHiY.s', time()-10);
system("date $stamp");

1 如果 PHP 在 mod_php 下运行(默认设置),则 PHP 以与 Apache 相同的用户身份运行。这通常意味着您将无权执行此操作。如果发生这种情况,您可以通过调用另一个可以更改时间的脚本或程序来绕过它。

【讨论】:

  • 这不是他想要的答案。他要求使用 PHP 提供解决方案,该解决方案通常以与网络服务器相同的用户身份运行。即使使用 system() 他也无法更改系统时间。
  • @halfdan 那么,你有什么建议?
  • 查看接受的答案。他只是想输出 10 秒前的时间形式,而不是更改系统时间。那么为什么不从 time() 中减去 10 秒呢?
  • @halfdan 这就是我最初的假设(并回答)。但是 OP 编辑​​了问题并添加了以下内容:“我不想获取当前时间然后从 time 中删除 10 秒。”
  • 这有点误导,我同意。但他的措辞表明他不是很有经验,所以我得出的结论是他只想从当前时间减去 10 秒。 (反正没给你投反对票,答案还是不错的)
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多