【问题标题】:Convert mm/dd/yy to mm/dd/yyyy in PHP在 PHP 中将 mm/dd/yy 转换为 mm/dd/yyyy
【发布时间】:2010-07-15 00:40:08
【问题描述】:

我正在从事一个项目,该项目需要我从文件中读取值并在将它们存储在其他地方之前稍微操作它们。我需要做的一件事是将一些日期从 mm/dd/yy 格式转换为 mm/dd/yyyy 格式。对我来说不幸的是,我对 PHP 和正则表达式相对较新(我认为这是解决这个问题的更好方法之一),因此有点迷惑。任何和所有的帮助将不胜感激。谢谢!

【问题讨论】:

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

标签: php regex date


【解决方案1】:

PHP 有一个 built-in function strtotime() 专门用于此类任务...它甚至会根据此规则对 2 位数年份进行最佳猜测:00-69 之间的值是映射到 2000-2069 和 70-99 到 1970-1999。一旦您有了 PHP 喜欢的 UNIXy 格式的日期/时间,您就可以使用date() function 将其打印出来。

<?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/Y'....?OP 想要从 YY 到 YYYY ...一个 Y 是四位数的年份。
  • 我的意思是最后一行的“m/d/Y”(无法编辑我之前的评论)。小写 m 和 d 保留前导零。
  • @Peter Ajtai -- 是的,你完全正确。 (我应该在发布之前尝试确认!)我现在会更正它。
【解决方案2】:

你可以试试这个,它可能有效,也可能无效:

$new_date = date( 'm/d/Y', strtotime( $old_date ) );

$old_date 是您所说的格式。

【讨论】:

  • 如果日期格式为mm-dd-yy,则此代码无效。所以我们必须通过将- 替换为/ 来将mm-dd-yy 转换为mm/dd/yy
【解决方案3】:

这里的一个问题是YY,假设它是相对最新的,可以是 19YY 或 20YY。这意味着您应该选择一个号码作为截止号码。我们称之为$cutOff 如果YY 小于$cutOff,我们想要20YY 如果大于我们想要19YY

您可以使用正则表达式来完成,但由于您的示例很简单且正则表达式往往较慢,您可以简单地使用 substrsubstr_replace 进行字符串操作。

以下是如何更改字符串 mm/dd/yy int 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 的自时代以来经过的秒数。
【解决方案4】:

您可以添加以两个值(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

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多