PHP将2位数年份转换为4位数年份

时间:2013-06-10 18:24:36

标签: php date

我有来自数据库的数据,采用2位数年份格式13我希望将其转换为2013我在下面尝试了以下代码...

$result = '13';

$year = date("Y", strtotime($result));

但是它返回了1969年

我该如何解决这个问题?

11 个答案:

答案 0 :(得分:20)

$dt = DateTime::createFromFormat('y', '13');
echo $dt->format('Y'); // output: 2013

69会产生206970会产生1970。如果您对这样的规则没有问题,那么请保持原样,否则,根据您自己的规则预先填写您自己的世纪数据。

答案 1 :(得分:11)

您未包含的一条重要信息是:您认为如何将2位数年份转换为4位数年份?

例如,我猜你相信2013年1月1日是在2013年。01/01/23怎么样?那是2023年吗?还是1923年?甚至1623年?

大多数实施将选择100年期间并假设2位数表示该期间内的一年。

最简单的例子:年份在2000-2099范围内。

// $shortyear is guaranteed to be in range 00-99
$year = 2000 + $shortyear;

如果我们想要不同的范围怎么办?

$baseyear = 1963; // range is 1963-2062
                  // this is, of course, years of Doctor Who!
$shortyear = 81;
$year = 100 + $baseyear + ($shortyear - $baseyear) % 100;

试一试。这使用模数函数(带有%的位)来计算基准年的偏移量。

答案 2 :(得分:7)

$result = '13';

$year = '20'.$result;

if($year > date('Y')) {
   $year = $year - 100;
}

//80 will be changed to 1980
//12 -> 2012

答案 3 :(得分:1)

问题在于strtotime。使用strtotime(“now”)尝试相同的事情。

答案 4 :(得分:1)

只需手动添加(添加到前面)字符串“20”:

$result = '13';
$year = "20".$result;
echo $year; //returns 2013

答案 5 :(得分:1)

这可能是最愚蠢的,但快速修复将是:

$result = '13';
$result = '1/1/20' . $result;
$year = date("Y", strtotime($result)); // Returns 2013

或者您可以使用以下内容:

date_create_from_format('y', $result);

答案 6 :(得分:1)

您可以使用date_create_from_format()

格式创建日期对象

http://www.php.net/manual/en/datetime.createfromformat.php

$year = date_create_from_format('y', $result);

echo $year->format('Y')

答案 7 :(得分:1)

使用DateTime课程,尤其是DateTime::createFromFormat(),为此:

$result = '13';
// parsing the year as year in YY format
$dt = DateTime::createFromFormat('y', $result);
// echo it in YYYY format
echo $dt->format('Y');

答案 8 :(得分:0)

我只是一个新手黑客,我知道这段代码很长。当我在寻找解决问题的方法时,我偶然发现了你的问题。我将数据输入到HTML表单中(懒得键入4位数年份)然后写入数据库而我(由于我不会厌烦你的原因)想要将日期存储在4中数字年份格式。正好与你的问题相反。

表单返回$ date(我知道我不应该使用这个词,但我做了)作为01/01/01。我确定当前年份($ yn)并进行比较。无论进入哪一年,如果日期是本世纪它将成为20XX。但如果它不到100(本世纪)就像89那样它将在1989年出现。随着年份的变化,它将在未来继续发挥作用。总是好100年。希望这会对你有所帮助。

//将$ date分成两个字符串

$datebegin = substr($date, 0,6);

$dateend = substr($date, 6,2);

//获取当年的最后两位数字

$yn=date("y");

//确定世纪

if ($dateend > $yn && $dateend < 100)   
{
    $year2=19;
}

elseif ($dateend <= $yn)

{
    $year2=20;
}

//将两个字符串放回一个

$date = $datebegin . $year2 . $dateend; 

答案 9 :(得分:0)

我在导入excel(CSV)DOB字段方面遇到了类似的问题,其中包含过时的n.american样式日期格式,年份为2位数。我需要在数据库中写出正确的yyyy-mm-dd。虽然不完美,但这就是我所做的:

//$col contains the old date stamp with 2 digit year such as 2/10/66 or 5/18/00

$yr = \DateTime::createFromFormat('m/d/y', $col)->format('Y');
if ($yr > date('Y')) $yr = $yr - 100;
$md = \DateTime::createFromFormat('m/d/y', $col)->format('m-d');
$col = $yr . "-" . $md;

//$col now contains a new date stamp, 1966-2-10, or 2000-5-18 resp.

答案 10 :(得分:0)

如果您确定年份总是20,那么第一个答案就有效,否则,实际上没有办法做出期间的问题。你不知道这一年是过去,现在还是将来的世纪。

当然,问题中没有足够的信息来确定这些日期是否总是<= now,但即便如此,您也不知道011901还是{{1} }}。这是不可能的。