我在mysql中有一个文本列,它以yyyy-mm-dd格式存储日期值。 现在,在我的php页面中,我使用此代码解析为日期值。
date("F j, Y", strtotime($row['value']));
现在,我刚刚读到strtotime()仅在1970年1月1日之后解析值。我在该日期之前有很多日期值。有工作吗?我不想改变我的数据库结构。
答案 0 :(得分:14)
来自documentation for strtotime()
:
strtotime()在格林威治标准时间1901年12月13日20:45:54和格林威治标准时间2038年1月19日星期二03:14:07之间的范围限制;虽然在PHP 5.1.0之前,但在某些操作系统(Windows)上,此范围仅限于01-01-1970至19-01-2038。
您运行的是哪个版本的PHP?在什么平台上?也许现在是升级的时候了。
如果您正在处理1901年12月13日至2038年1月19日范围之外的日期,那么请考虑使用PHP的DateTime对象,这些对象可以使用更广泛的日期范围。
<强>程序:强>
$date = date_create($row['value']);
if (!$date) {
$e = date_get_last_errors();
foreach ($e['errors'] as $error) {
echo "$error\n";
}
exit(1);
}
echo date_format($date, "F j, Y");
<强> OOP:强>
try {
$date = new DateTime($row['value']);
} catch (Exception $e) {
echo $e->getMessage();
exit(1);
}
echo $date->format("F j, Y");
答案 1 :(得分:1)
您应该使用date
列,而不是文本1
和date_format()
SQL函数,用于格式化查询中的日期
答案 2 :(得分:1)
function safe_strtotime($string)
{
if(!preg_match("/\d{4}/", $string, $match)) return null; //year must be in YYYY form
$year = intval($match[0]);//converting the year to integer
if($year >= 1970) return date("Y-m-d", strtotime($string));//the year is after 1970 - no problems even for Windows
if(stristr(PHP_OS, "WIN") && !stristr(PHP_OS, "DARWIN")) //OS seems to be Windows, not Unix nor Mac
{
$diff = 1975 - $year;//calculating the difference between 1975 and the year
$new_year = $year + $diff;//year + diff = new_year will be for sure > 1970
$new_date = date("Y-m-d", strtotime(str_replace($year, $new_year, $string)));//replacing the year with the new_year, try strtotime, rendering the date
return str_replace($new_year, $year, $new_date);//returning the date with the correct year
}
return date("Y-m-d", strtotime($string));//do normal strtotime
}
答案 3 :(得分:1)
$date = DateTime::createFromFormat('d M Y','17 Jan 1900');
echo $date->format('Y-m-d');
答案 4 :(得分:0)
我是一个菜鸟,并且在使用strtotime和爆炸时遇到了类似的问题。我碰到了这个帖子,得到了Mark Baker对日期限制更改的评论的帮助很大(谢谢!)。所以我写这个代码只是为了玩这个概念。也许它会帮助像我这样的其他新手。
只需更改顶部PHP行的日期,看看下面的日期会发生什么 - 非常有趣。 再次感谢!
<?php $dob = "1890-11-11"; ?>
<html>
<head>
<style>
.inputdiv {
width:200px;
margin:100px auto 10px auto;
background-color:#CCC2FC;
text-align:center;
border:1px solid transparent;}
.spacer{
width:199px;
margin:20px auto 20px auto;}
</style>
</head>
<body>
<div class="inputdiv">
<div class="spacer"><?php echo "Raw dob: ".$dob ?></div>
<div class="spacer"><?php echo "Strtotime dob: ".date("m-d-Y", strtotime($dob)) ?></div>
<div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob);
$dob = sprintf("%02d-%02d-%04d", $m, $d, $y);
echo "Explode dob: ".$dob ?></div>
</div>
</body>
</html>
答案 5 :(得分:0)
为了更新现代,64位系统上的PHP7 strtotime()几乎可以处理任何AD日期,尽管由于某些原因,该手册页仍然说1970年。
$t = strtotime("4/1/1492");
echo "Stamp: $t\n";
echo date("m/d/Y",$t);
结果:
Stamp: -15076350000
04/01/1492
和
$t = strtotime("8/1/4921");
echo "Stamp: $t\n";
echo date("m/d/Y",$t);
结果
Stamp: 93142933200
08/01/4921
答案 6 :(得分:0)
我有一个Sql数据库,用于处理美国各州的成立时间,可回溯到1787年。此字段在数据库中以YYYY-MM-DD格式(例如1787-12-07)设置DATE。 。我尝试了许多方法,但发现的最简单有效的方法是: (我使用的确切代码片段。根据需要更改信息和变量。)
<?php
$page = 'geo-usa.php';
$sort = 'stateName';
if (isset($_GET['sortBy'])){
$sortBy = $_GET['sortBy'];
if($sortBy == 'stateEst'){
$sort = 'stateEst'; }
if($sortBy == 'capital'){
$sort = 'stateCapital'; }
if($sortBy == 'capitalEst'){
$sort = 'stateCapitalEst'; } }
$con=mysqli_connect($servername, $hostname, $password, $database);
if (mysqli_connect_errno()){ print "Failed to connect to MySQL: " .
mysqli_connect_error(); exit(); }
$stateData = "SELECT * FROM state ORDER BY $sort ASC, stateEst ASC";
$stateData2 = mysqli_query($con, $stateData);
while($stateData3 = mysqli_fetch_array($stateData2, MYSQLI_ASSOC)){
$stateID = $stateData3['stateID'];
$stateName = $stateData3['stateName'];
$stateAbr = $stateData3['stateAbr'];
$stateEstYear = $stateData3['stateEstYear'];
$stateEst = $stateData3['stateEst'];
$stateCapital = $stateData3['stateCapital'];
$stateCapitalEst = $stateData3['stateCapitalEst'];
$stateMotto = $stateData3['stateMotto'];
//Here is how you format a yyyy-mm--dd date within a database
$stateEstDate = date_create($stateData3['stateEst']);
$stateEstFormat = date_format($stateEstDate, "l F d, Y");
/// <- remove comments -
print "<table border='0' bordercolor='lime' cellpadding='1'
cellspacing='1' width='100%'>
<tr>
<td align='left' style='padding-top:10px;'>
<a href='$page' style='font-size:14px; color:red; text-
decoration:none; padding-left:7px'>
$stateName</a></td>
</tr>
<tr>
<td align='left' style='padding-left:20px;'>
<a href='$page?sortBy=stateEst' style='font-size:10px;
color:white; text-decoration:none;'>
$stateEstFormat </a></td>
</tr>
</table>"; } ?>
前2行的输出为:
特拉华州 1787年12月7日,星期五
宾夕法尼亚州 1787年12月12日,星期三