php将字符串转为date,关于php:将字符串转换为Date和DateTime

如果我有一个格式为mm-dd-YYYY的php字符串(例如,10-16-2003),如何正确地将其转换为Date,然后再转换为YYYY-mm-dd格式的DateTime?我同时要求Date和DateTime的唯一原因是我需要一个在一个地方,另一个在另一个地方。

在第一次约会时使用strtotime(),然后使用date('Y-m-d')将其转换回:

$time = strtotime('10/16/2003');

$newformat = date('Y-m-d',$time);

echo $newformat;

// 2003-10-16

注意,在strtotime()函数中使用正斜线/和连字符-有区别。从php.net引用:

Dates in the m/d/y or d-m-y formats

are disambiguated by looking at the

separator between the various

components: if the separator is a

slash (/), then the American m/d/y is

assumed; whereas if the separator is a

dash (-) or a dot (.), then the

European d-m-y format is assumed.

这行不通。PHP将该输入解释为dd-mm-yyyy。

我在代码中添加了更多的解释,谢谢@konforce

阅读下一个答案以获得更好的解决方案

我有1970年,但不是全部…

@删除日期字符串很可能不是正确的日期。

是的,我用"str_replace('/'、'-'、$var);"after apply"日期('y-m-d'…)解决了这个问题,并且效果很好

如果我的日期是2017年12月2日,它就不起作用了

这不起作用,因为这个答案有误导性。strtotime接受某些格式。你不能吃任何东西。这就是为什么应该使用DateTime::createFromFormat而不是strtotime。不幸的是,这个答案有太多的赞成票,任何人都无法注意。这些天都是复制粘贴。

您需要注意M/D/Y和M-D-Y格式。php认为/表示m/d/y,-表示d-m-y。在这种情况下,我将明确描述输入格式:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

这样的话,你就不会对某一种解释产生兴趣了。

好奇为什么这不是公认的答案…这比依赖于strtotime()函数的怪癖要灵活得多。

重要的是指出php datetime类自php版本5.2起可用,而createfromformat自5.3起可用。

和每个函数一样,您应该检查它是否满足您必须支持的最低版本。但PHP5.2eol是2011年1月。任何人都不应该再运行它了;迎合那些人只会让他们运行过时的、不安全的软件。

@马修是的,没错。但你从来没有,即使今天我发现一个php4.1版本仍然安装…

要分析日期,应使用:日期时间::CreateFromFormat();

前任:

$dateDE ="16/10/2013";

$dateUS = \DateTime::createFromFormat("d.m.Y", $dateDE)->format("m/d/Y");

但是,要小心,因为这会导致:

PHP Fatal error: Call to a member function format() on a non-object

您实际上需要检查格式化是否正常,首先:

$dateDE ="16/10/2013";

$dateObj = \DateTime::createFromFormat("d.m.Y", $dateDE);

if (!$dateObj)

{

throw new \UnexpectedValueException("Could not parse the date: $date");

}

$dateUS = $dateObj->format("m/d/Y");

现在,您将得到一个可以捕获、传播等的异常,而不是崩溃。

$datede格式错误,应为"2013年10月16日";

请注意,这样检查$dateobj只会确保格式与掩码匹配,而不是日期实际有效。例如,99/99/2010这样的日期将通过此检查,因为它与M/D/Y匹配,但它不是您通常希望允许的日期。这个答案解决了这种情况->stackoverflow.com/a/10120725/995014

$d = new DateTime('10-16-2003');

$timestamp = $d->getTimestamp(); // Unix timestamp

$formatted_date = $d->format('Y-m-d'); // 2003-10-16

编辑:您还可以将date time zone传递给date time()构造函数,以确保为所需时区(而不是服务器默认时区)创建日期。

我相信这会引发一个例外,因为第16个月是无效的。

重要的是指出php datetime类自php版本5.2起可用,getTimestamp自5.3起可用。

如果您的格式是dd-mm-yyyy,那么在PHP中,它将无法按预期工作。在PHP文档中,它们具有以下指导原则。

Dates in the m/d/y or d-m-y formats are disambiguated by looking at

the separator between the various components: if the separator is a

slash (/), then the American m/d/y is assumed; whereas if the

separator is a dash (-) or a dot (.), then the European d-m-y format

is assumed.

所以,你不能随心所欲地使用。当您尝试将dd/mm/yyyy格式与此一起使用时,它将删除false。您可以对以下内容进行调整。

$date ="23/02/2013";

$timestamp = strtotime($date);

if ($timestamp === FALSE) {

$timestamp = strtotime(str_replace('/', '-', $date));

}

echo $timestamp; // prints 1361577600

第一次约会

$_firstDate = date("m-d-Y", strtotime($_yourDateString));

对于新日期

$_newDate = date("Y-m-d",strtotime($_yourDateString));

就像我们有日期"2018年5月7日",我们需要日期"2018-05-07"作为MySQL兼容

if (!empty($date)) {

$timestamp = strtotime($date);

if ($timestamp === FALSE) {

$timestamp = strtotime(str_replace('/', '-', $date));

}

$date = date('Y-m-d', $timestamp);

}

它对我有用。享受:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值