【问题标题】:strtotime function return 01/01/70 with valid inputstrtotime 函数返回 01/01/70 和有效输入
【发布时间】:2013-10-27 08:35:30
【问题描述】:

我有一个来自 varchar 类型的数据库列的有效日期,全部采用 d/m/y 格式。然后,当我尝试使用 strtotime 函数和日期格式将其转换为日期格式时,我得到 01/01/70。我什至尝试用纯字符串值替换数据库结果。 我已经搜索并找到了这个链接 PHP strtotime returns a 1970 date when date column is null PHP : strtotime() returns always 01/01/1970 strtotime() does not return correct value when specifying date in dd/mm/yyyy format 但两者都没有帮助,因为数据不为空并且格式有效。这是我的代码的 sn-p

if(isset($item['prep_date']) && $item['prep_date'] != NULL){
    $trial=$item['prep_date'];
    echo ": ".$trial;
    $prepDate= strtotime($trial);
    $prepDate = date('d/m/y', $prepDate);
    echo "= ".$prepDate;
}

我错过了什么?这是两个回声的结果

28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 03/01/13= 01/03/13: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 18/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 02/09/13= 09/02/13: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 05/11/13= 11/05/13: 28/10/13= 01/01/70: 28/11/13= 01/01/70: 05/11/13= 11/05/13: 28/10/13= 01/01/70: 28/10/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 05/11/13= 11/05/13: 11/12/13= 12/11/13: 11/12/13= 12/11/13: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 11/12/13= 12/11/13: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 28/11/13= 01/01/70: 30/01/14= 01/01/70

【问题讨论】:

  • 能否请您 echo 或 var_dump($item['prep_date']) 并发布结果?
  • 28/11/13 被视为11th day of 28th month (令我惊讶的是,从03/01/13= 01/03/13 结果对您来说并不明显)。如果你想要day month year 顺序 - 使用点,而不是斜线
  • 是的,使用 4 位数年份也是一个非常好的习惯
  • @zerkms 我专门给了 d/m/y 来指定第 11 个月的第 28 天。这怎么可能
  • @altsyset:我不明白。 “strtotime function return 01/01/70 with valid input”---不正确,没有第 28 个月(在这个星球上)。 “我专门给了 d/m/y 来指定第 11 个月的第 28 天”——不,你这样做是为了 FORMATTINGAFTER 解析

标签: php date


【解决方案1】:

因为您的strtotime() 返回了false,所以您获得了 1970 年的值:

var_dump( strtotime('28/11/13') ); # false

看看supported date and time formatsstrtotime 假设这是美国的月、日和年 (mm/dd/yyyy),就像它说的 here

如果输入的格式是dd/mm/yyyy,那么最简单的方法是在str_replace('/', '.', 'dd/mm/yyyy'); 上使用DateTime::createFromFormatstrtotime 使其成为欧洲日期格式dd.mm.yyyy

【讨论】:

  • 运算是 2 位数年份,DateTime 还能处理吗?
  • @Ryan:它甚至可以处理 1 位数字。见standard format for american format。描述=American month, day and year;格式 = mm "/" dd "/" y;示例 = "12/22/78", "1/17/2006", "1/17/6".
  • 这是更简单的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2023-03-03
  • 2016-06-03
  • 2013-07-23
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多