在PHP中将mm/dd/yy转换为mm/dd/yyyy

3

我正在处理一个需要从文件中读取数据并在存储到其他地方之前稍微修改的项目。其中一件我需要做的事情是将某些日期从mm/dd/yy格式转换为mm/dd/yyyy格式。不幸的是,我对PHP和正则表达式(我认为这是解决这个问题的较好方法之一)相对较新,因此有些困惑。任何帮助都将不胜感激。谢谢!


2
一个四位数的年份可以表示10,000种可能性。而一个两位数的年份只能处理100种可能性。那么'20'是什么意思呢?是1920年还是2020年?或者是8720年? - Borealid
1
@Borealid:这是PHP所面临的同样问题,它接受像12/22/78这样的日期。通常通过设置一个值L来解决这个问题,该值与两位数年份yy进行比较;如果yy大于L,则四位数年份为19yy;否则四位数年份为20yy - apaderno
4个回答

5

PHP有一个内置函数strtotime(),专门用于这种任务...它甚至可以根据以下规则猜测2位数的年份:00-69之间的值映射到2000-2069,70-99映射到1970-1999。一旦你有了PHP偏好的UNIX格式的日期/时间,那么你就可以使用date()函数以任何你想要的方式打印它。

<?php
$str = '02/28/98';

// in PHP 5.1.0+, strtotime() returns false if it fails
// previous to PHP 5.1.0, you would compare with -1 instead of false
if (($timestamp = strtotime($str)) === false) {
    echo "Couldn't figure out the date ($str)!";
} else {
    echo "Reformatted date is " . date('m/d/Y', $timestamp);
}
?>

(我假设这里不考虑时区,否则会增加复杂性。)

你是不是想用date('MM/DD/YYYY'....? OP想从YY转换为YYYY...一个Y代表四位数的年份。 - Peter Ajtai
1
请仅返回翻译后的文本:我在最后一行中指的是“m/d/Y”(月/日/年),其中小写字母m和d保留前导零。 - Peter Ajtai
@Peter Ajtai -- 是的,你说得完全正确。(在发布之前我应该尝试确认!) 我现在会更正它。 - ewall

2
这里的一个问题是,假设 YY 是相对较新的,它可以是19YY或20YY。这意味着你应该选择一个数字作为分界线。让我们称其为$cutOff。如果YY小于$cutOff,我们要20YY,如果大于我们要19YY
你可以用正则表达式来实现,但由于你的示例很简单,而且正则表达式往往比较慢,所以你可以使用substrsubstr_replace进行字符串操作。
以下是如何将字符串 mm/dd/yy 更改为 mm/dd/yyyy:
<?php
// Our date
$str = "01/04/10";
$cutoff = 50;
// See what YY is
// Get the substring of $str starting two from the end (-2)... this is YY
$year = substr($str, -2);
// Check whether year added should be 19 or 20
if ($year < 50)
    // PHP converts string to number nicely, so this is our 20YY
    $year += 2000;
else
    // This is 19YY
    $year += 1900;
// Repace YY with YYYY
// This will take $str and replace the part two from the end (-2) undtil 
// the end with $year.
$str = substr_replace($str, $year, -2);  
// See what we got
echo $str;
?>

很好的解释,如果strtotimes()使用“70”作为基准年份,或者您有早于1970年的日期,因为它们不适合UNIX自纪元以来经过的秒数日期。这种策略非常必要。 - ewall

2
您可以尝试这个方法,但并不一定有效:
$new_date = date( 'm/d/Y', strtotime( $old_date ) );

$old_date是您所讨论的格式。


如果日期格式为“mm-dd-yy”,则此代码将无法正常工作。因此,我们必须通过将“-”替换为“/”来将“mm-dd-yy”转换为“mm/dd/yy”。 - Prifulnath

0
您可以按照以下方式附加年份的前两个值(19或20):
//for $s_date = "yy-dd-mm"
if (substr($s_date,6,2) >= 50){
    $standarddate  = "19" . substr($s_date,6,2); //19yy
    $standarddate .= "-"  . substr($s_date,0,2); //mm
    $standarddate .= "-"  . substr($s_date,3,2); //dd
} else {
    $standarddate  = "20" . substr($s_date,6,2); //20yy
    $standarddate .= "-"  . substr($s_date,0,2); //mm
    $standarddate .= "-"  . substr($s_date,3,2); //dd
}
// you will get yyyy-mm-dd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接