我有来自数据库的数据,采用2位数年份格式13
我希望将其转换为2013
我在下面尝试了以下代码...
$result = '13';
$year = date("Y", strtotime($result));
但是它返回了1969年
我该如何解决这个问题?
答案 0 :(得分:20)
$dt = DateTime::createFromFormat('y', '13');
echo $dt->format('Y'); // output: 2013
69
会产生2069
。 70
会产生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
,但即便如此,您也不知道01
是1901
还是{{1} }}。这是不可能的。