我有来自数据库的 2 位数年份格式的数据13
我希望将其转换为2013
我尝试了以下代码...
$result = '13';
$year = date("Y", strtotime($result));
但它在 1969 年回归
我怎样才能解决这个问题?
$dt = DateTime::createFromFormat('y', '13');
echo $dt->format('Y'); // output: 2013
69
将导致2069
. 70
将导致1970
. 如果您对这样的规则没意见,请保持原样,否则,根据您自己的规则添加您自己的世纪数据。
您没有包含的一条重要信息是:您认为如何将 2 位数年份转换为 4 位数年份?
例如,我猜你认为 2013 年 1 月 1 日是 2013 年 1 月 1 日。那么 23 年 1 月 1 日呢?那是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;
试试看。这使用模函数(带有 % 的位)来计算与基准年的偏移量。
$result = '13';
$year = '20'.$result;
if($year > date('Y')) {
$year = $year - 100;
}
//80 will be changed to 1980
//12 -> 2012
Use the DateTime
class, especially DateTime::createFromFormat()
, for this:
$result = '13';
// parsing the year as year in YY format
$dt = DateTime::createFromFormat('y', $result);
// echo it in YYYY format
echo $dt->format('Y');
You can create a date object given a format with date_create_from_format()
http://www.php.net/manual/en/datetime.createfromformat.php
$year = date_create_from_format('y', $result);
echo $year->format('Y')
问题在于strtotime。用 strtotime("now") 尝试同样的事情。
只需手动添加(添加到前面)字符串“20”:
$result = '13';
$year = "20".$result;
echo $year; //returns 2013
这可能是最愚蠢的,但快速解决方法是:
$result = '13';
$result = '1/1/20' . $result;
$year = date("Y", strtotime($result)); // Returns 2013
或者你可以使用这样的东西:
date_create_from_format('y', $result);
我只是一个新手黑客,我知道这段代码很长。当我在寻找解决问题的方法时,我偶然发现了你的问题。我正在将数据输入 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;
如果您确定年份始终是20
某事,那么第一个答案有效,否则,真的没有办法做被问到的事情period。你不知道这一年是过去的、现在的还是未来的世纪。
当然,问题中没有足够的信息来确定这些日期是否总是<= now
,但即使那样,您也不知道01
是1901
还是2001
。它只是不可能的。
我在导入 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.