18

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

$result = '13';

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

但它在 1969 年回归

我怎样才能解决这个问题?

4

11 回答 11

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

69将导致2069. 70将导致1970. 如果您对这样的规则没意见,请保持原样,否则,根据您自己的规则添加您自己的世纪数据。

于 2013-06-10T18:27:24.550 回答
12

您没有包含的一条重要信息是:您认为如何将 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;

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

于 2013-06-10T18:57:11.153 回答
10
$result = '13';

$year = '20'.$result;

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

//80 will be changed to 1980
//12 -> 2012
于 2013-06-10T18:27:17.687 回答
2

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');
于 2013-06-10T18:28:44.053 回答
1

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')
于 2013-06-10T18:28:09.697 回答
1

问题在于strtotime。用 strtotime("now") 尝试同样的事情。

于 2013-06-10T18:26:43.547 回答
1

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

$result = '13';
$year = "20".$result;
echo $year; //returns 2013
于 2013-06-10T18:27:15.877 回答
1

这可能是最愚蠢的,但快速解决方法是:

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

或者你可以使用这样的东西:

date_create_from_format('y', $result);
于 2013-06-10T18:27:30.427 回答
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; 
于 2014-04-20T21:10:35.940 回答
0

如果您确定年份始终是20某事,那么第一个答案有效,否则,真的没有办法做被问到的事情period。你不知道这一年是过去的、现在的还是未来的世纪。

当然,问题中没有足够的信息来确定这些日期是否总是<= now,但即使那样,您也不知道011901还是2001。它只是不可能的。

于 2017-12-13T18:49:36.177 回答
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.
于 2017-10-13T08:12:31.640 回答