【问题标题】:Why does strtotime('x') return tomorrows date为什么 strtotime('x') 返回明天的日期
【发布时间】:2012-09-03 22:38:04
【问题描述】:

我无法理解 - 为什么会发生以下情况?

echo date("d-m-Y", strtotime($str));

$str = '214454';  // Produces todays date
$str = '333333';  // Produces 1-1-1970
$str = 'a' (or ANY single char)  // Produces tomorrows date
$str = 'aa' (or ANY double char)  // Produces 1-1-1970

或者只是返回 strtotime 函数

echo strtotime($str);

$str = '214454';  // Produces todays date
$str = '333333';  // returns false
$str = 'a' (or ANY single char)  // Produces tomorrows date
$str = 'aa' (or ANY double char)  // returns false

这些值来自我正在进行的一些测试,以尝试找出特定函数如何/为什么返回某些值。

它导致我的函数失败 - 因为你会假设“a”(或任何单个字符)作为错误的错误日期返回。

【问题讨论】:

  • 因为单个字符被视为时区。 timeanddate.com/library/abbreviations/timezones/military这必须是评论。
  • @PLB - 谢谢 - 但我无法在任何地方的 strtotime() 文档中找到它?
  • @TheShiftExchange Jon,已经比我更好地回答了这个问题。几个月前我遇到了同样的问题,并在致电strtotime 之前通过检查解决了它。
  • @PLB 实际上你的桌子有效;)我会保留它作为答案
  • @PLB:尽管您的回答实际上是正确的,并且是第一个。如果你扩大一点而不是删除它,我肯定会投赞成票。

标签: php strtotime


【解决方案1】:

单字符和双字符都被解释为timezones(表“使用的符号”,行“tz”);六位数字被解释为HHMMII(表“24 小时表示法”,行“小时、分钟和秒,无冒号”)。

有效格式

在第一种和第三种情况下解析成功,strtotime 返回一个时间戳,date 打印它对应的任何日期。第一种情况成功的原因很明显;对于第三种情况,请记住 military time zones 可以用单个字母引用,然后结果才有意义。关注this code

$zones = range('a', 'z');
$last = null;

foreach($zones as $tz) {
    $ts = strtotime($tz);
    if ($last !== null) {
        echo "TZ $last[0] => TZ $tz: change = ".($ts - $last[1])."\n";
    }
    $last = array($tz, $ts);
}

打印出来

TZ a => TZ b: change = -3600
TZ b => TZ c: change = -3600
TZ c => TZ d: change = -3600
TZ d => TZ e: change = -3600
TZ e => TZ f: change = -3600
TZ f => TZ g: change = -3600
TZ g => TZ h: change = -3600
TZ h => TZ i: change = -3600
TZ i => TZ j: change = -1346649725
TZ j => TZ k: change = 1346646125
TZ k => TZ l: change = -3600
TZ l => TZ m: change = -3600
TZ m => TZ n: change = 46800
TZ n => TZ o: change = 3600
TZ o => TZ p: change = 3600
TZ p => TZ q: change = 3600
TZ q => TZ r: change = 3600
TZ r => TZ s: change = 3600
TZ s => TZ t: change = 3600
TZ t => TZ u: change = 3600
TZ u => TZ v: change = 3600
TZ v => TZ w: change = 3600
TZ w => TZ x: change = 3600
TZ x => TZ y: change = 3600
TZ y => TZ z: change = -43200

您可以看到我们从一个时区到另一个时区的连续性;不存在时区'j' 的不连续性(此处解析失败,结果相同,如下所述); 'n' 时区的不连续性,我们从 UTC+12 移动到 UTC-1 等。

无效格式

在第 2 和第 4 种情况下,解析失败,strtotime 返回 false,这与调用 date("d-m-Y", 0) 的效果相同——它格式化了纪元的开始(1970 年 1 月 1 日 00:00 :00)。发生这种情况是因为false 按照正常的type juggling rules 转换为整数0

strtotime('x') 真正返回了什么?

它返回 UTC-11 时区的当前时间(这是“x 射线”军事时区)。根据您的本地时间和时区,从您的角度来看,这通常是“今天”或“明天”。如果您的时间恰好低于 UTC-11,那么它甚至可能是“昨天”(尽管 that's not quite likely)。

【讨论】:

    【解决方案2】:
    • 214454 被视为时:分:秒
    • 333333 因为没有33小时

    【讨论】:

    • 它在哪里说“任何单个字符都被视为明天”?因为我做的第一件事是检查php.net/manual/en/function.strtotime.php - 它没有提到这一点?
    • 您可以通过看到ax 产生不同的日期来确认meze 的断言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    相关资源
    最近更新 更多