我已尝试使用date("m/d/Y", strtotime("04-05-2012"))
,但我会得到"05/04/2012"
或其他日期,例如"03-30-2012"
我会得到"12/31/1969"
(这有意义,因为它混淆了月和日没有30个月。所以我该怎么办呢?我还想把这个值转换成UNIX时间,以便我可以针对MySQL db进行搜索。
答案 0 :(得分:8)
您可以使用DateTime对象和createFromFormat静态方法来执行此操作:
$date = DateTime::createFromFormat('m-d-Y',"03-30-2012");
$date->format('m/d/Y');
答案 1 :(得分:6)
如果你确定你开始使用的格式是DD-MM-YYY,为何不使用简单的替换?
e.g。 $newDate = str_replace('-', '/', '04-05-2012');
答案 2 :(得分:1)
一种方法是使用explode()
和mktime()
:
$inDate = '03-30-2012';
list($m, $d, $y) = explode('-', $inDate);
$outDate = date('m/d/Y', mktime(0, 0, 0, $m, $d, $y));
这假设格式在某种程度上是动态的。否则,str_replace()
是您最好的选择,正如其他人指出的那样。
答案 3 :(得分:0)
这不是一个日期格式问题,而是一个字符串操作问题。
但是,知道 strtotime()
存在仍然很好。
[ghoti@pc ~]$ cat transdate.php
#!/usr/local/bin/php
<?php
$olddate = "04-05-2012"; // assuming mm-dd-YYYY
// Get the date parts into an array
$parts = explode("-", $olddate);
// Switch to YYYY-mm-dd, which will be interpreted consistently
$neworder = sprintf("%s-%s-%s", $parts[2], $parts[0], $parts[1]);
printf("New order: %s\n", $neworder);
// Set your timezone, or PHP will whine and complain
date_default_timezone_set('America/Toronto');
// Convert your reordered date to an epoch second (unix timestamp)
$epoch = strtotime($neworder);
// At a terminal, `man strftime` (or read the PHP function's docs) for details.
print "Alternate formats:\n";
printf("\t%s\n", strftime("%D", $epoch));
printf("\t%s\n", strftime("%F", $epoch));
printf("\t%s\n", strftime("%A %B %e, %Y (week %U)", $epoch));
[ghoti@pc ~]$ ./transdate.php
New order: 2012-04-05
Alternate formats:
04/05/12
2012-04-05
Thursday April 5, 2012 (week 14)
[ghoti@pc ~]$
这适用于PHP 5.1.6。哎呀,它应该在PHP 4中工作,除了date_default_timezone_set()
。