我以“YYYY-MM-DD HH:MM:SS”格式(例如“2013-05-28 12:58:24”)从MySQL获取日期。如何将这样的日期转换为可读的字符串,如“此文件将在2小时35分钟内过期”?提前致谢!php过期日期为字符串
1
A
回答
3
试试这个:
<?php
$startDate=strtotime(date('Y-m-d H:i:s'));
$endDate = strtotime('2013-05-28 12:58:24');
function work_hours_diff($date1,$date2) {
if ($date1>$date2) {
$tmp=$date1;
$date1=$date2;
$date2=$tmp;
unset($tmp);
$sign=-1;
} else $sign = 1;
if ($date1==$date2) return 0;
$days = 0;
$working_days = array(1,2,3,4,5); // Monday-->Friday
$working_hours = array(9, 17.5); // from 9:00 to 17:30 (8.5 hours)
$current_date = $date1;
$beg_h = floor($working_hours[0]);
$beg_m = ($working_hours[0]*60)%60;
$end_h = floor($working_hours[1]);
$end_m = ($working_hours[1]*60)%60;
//In case date1 is on same day of date2
if (mktime(0,0,0,date('n', $date1), date('j', $date1), date('Y', $date1))==mktime(0,0,0,date('n', $date2), date('j', $date2), date('Y', $date2))) {
//If its not working day, then return 0
if (!in_array(date('w', $date1), $working_days)) return 0;
$date0 = mktime($beg_h, $beg_m, 0, date('n', $date1), date('j', $date1), date('Y', $date1));
$date3 = mktime($end_h, $end_m, 0, date('n', $date1), date('j', $date1), date('Y', $date1));
if ($date1<$date0) {
if ($date2<$date0) return 0;
$date1 = $date0;
if ($date2>$date3) $date2=$date3;
return $date2-$date1;
}
if ($date1>$date3) return 0;
if ($date2>$date3) $date2=$date3;
return $date2-$date1;
}
//setup the very next first working time stamp
if (!in_array(date('w',$current_date) , $working_days)) {
// the current day is not a working day
// the current time stamp is set at the beginning of the working day
$current_date = mktime($beg_h, $beg_m, 0, date('n',$current_date), date('j',$current_date), date('Y',$current_date));
// search for the next working day
while (!in_array(date('w',$current_date) , $working_days)) {
$current_date += 24*3600; // next day
}
} else {
// check if the current timestamp is inside working hours
$date0 = mktime($beg_h, $beg_m, 0, date('n',$current_date), date('j',$current_date), date('Y',$current_date));
// it's before working hours, let's update it
if ($current_date<$date0) $current_date = $date0;
$date3 = mktime($end_h, $end_m, 0, date('n',$current_date), date('j',$current_date), date('Y',$current_date));
if ($date3<$current_date) {
// outch ! it's after working hours, let's find the next working day
$current_date += 24*3600; // the day after
// and set timestamp as the beginning of the working day
$current_date = mktime($beg_h, $beg_m, 0, date('n',$current_date), date('j',$current_date), date('Y',$current_date));
while (!in_array(date('w',$current_date) , $working_days)) {
$current_date += 24*3600; // next day
}
}
}
// so, $current_date is now the first working timestamp available...
// calculate the number of seconds from current timestamp to the end of the working day
$date0 = mktime($end_h, $end_m, 0, date('n',$current_date), date('j',$current_date), date('Y',$current_date));
$seconds = $date0-$current_date;
// calculate the number of days from the current day to the end day
$date3 = mktime($beg_h, $beg_m, 0, date('n',$date2), date('j',$date2), date('Y',$date2));
while ($current_date < $date3) {
$current_date += 24*3600; // next day
if (in_array(date('w',$current_date) , $working_days)) $days++; // it's a working day
}
if ($days>0) $days--; //because we've already count the first day (in $seconds)
// check if end's timestamp is inside working hours
$date0 = mktime($beg_h, $beg_m, 0, date('n',$date2), date('j',$date2), date('Y',$date2));
if ($date2<$date0) {
// it's before, so nothing more !
} else {
// is it after ?
$date3 = mktime($end_h, $end_m, 0, date('n',$date2), date('j',$date2), date('Y',$date2));
if ($date2>$date3) $date2=$date3;
// calculate the number of seconds from current timestamp to the final timestamp
$tmp = $date2-$date0;
$seconds += $tmp;
}
// calculate the working days in seconds
$seconds += 3600*($working_hours[1]-$working_hours[0])*$days;
return $sign * $seconds;
}
function seconds2human($ss) {
$s = $ss%60;
$m = floor(($ss%3600)/60);
$h = floor(($ss)/3600);
return "$h hours, $m minutes, $s seconds";
}
echo "This file will expire in ".seconds2human(work_hours_diff($startDate,$endDate));
?>
,你会得到的输出为:
This file will expire in 11 hours, 3 minutes, 15 seconds
+0
哦,非常感谢!它完美的工作! –
+0
尽管它有点奇怪:'$ endDate = strtotime(date('2013-05-28 14:39:41'));'它说'8小时30分钟',但它应该在24小时左右。 –
+1
@红色十月也许你需要设置日期时间对象的时区.. –
1
这更简单的实现使用PHP的DateTime类: -
$expire = \DateTime::createFromFormat('Y-m-d H:i:s', '2013-05-28 12:58:24');
$now = new \DateTime();
$diff = $expire->diff(($now));
$result = '';
if($diff->y){
$result .= $diff->y . ($diff->y > 1 ? ' years ' : ' year ');
}
if($diff->m){
$result .= $diff->m . ($diff->m > 1 ? ' months ' : ' month ');
}
if($diff->d){
$result .= $diff->d . ($diff->d > 1 ? ' days ' : ' day ');
}
if($diff->h){
$result .= $diff->h . ($diff->h > 1 ? ' hours ' : ' hour ');
}
if($diff->i){
$result .= $diff->i . ($diff->i > 1 ? ' minutes ' : ' minute ');
}
if($diff->s){
$result .= $diff->s . ($diff->s > 1 ? ' seconds ' : ' second ');
}
echo "File expires in $result";
输出,当我跑它: -
File expires in 16 hours 14 minutes 38 seconds
相关问题
- 1. PHP日期从字符串
- 2. 过滤字符串日期
- 3. 将字符串转换为日期php
- 4. PHP - 将字符串转换为日期
- 5. 转换字符串为日期值PHP
- 6. PHP将日期转换为字符串
- 7. 将字符串类型日期更改为日期字符串
- 8. 解析日期字符串(字符串转换为日期)
- 9. 将Javascript日期字符串转换为PHP日期
- 10. 转换PHP日期字符串“月”日期格式为大写
- 11. Mysql:日期为字符串
- 12. 数字日期到字符串日期
- 13. 将日期字符串转换为带日期的ISO日期
- 14. 转换日期为字符串,将字符串和逆变换为日期SQL
- 15. PHP - 解析字符串作为过去的日期
- 16. Golang:字符串日期日期
- 17. 日期从日期字符串在SunOS
- 18. 字符串到日期+治疗+日期字符串
- 19. 日期到字符串,字符串日期错误的Java
- 20. 日期到字符串<->字符串到日期
- 21. 从json日期字符串中提取日期到字符串
- 22. 串连日期字符串
- 23. PHP日期时间,解析字符串日期失败
- 24. 从字符串php获取日期 - 英国日期
- 25. 字符串与日期PHP日期时间
- 26. PHP字符串日期返回错误的日期
- 27. PHP - 转换字符串到日期
- 28. 转换冗长字符串日期PHP
- 29. PHP:更换日期字符串
- 30. PHP日期字符串压缩
你接受的答案被不必要地复杂化,因为它不使用PHP提供的最新课程。如果您选择使用它,我提供了一个更简单的解决方案。 – vascowhite