在PHP中格式化mysql时间戳,有几个条件

时间:2011-04-14 18:21:14

标签: php mysql sql time timestamp

我正在尝试根据以下条件格式化PHP中的SQL时间戳,但无法弄清楚如何。有人能指出我正确的方向吗?

  1. 如果时间戳是今天,则显示为下午4:15或12:30 AM
  2. 如果时间戳在今天之前但在过去7天内,则列为“星期日”或“星期一”
  3. 如果时间戳早于7天前,请列为'mm / dd / yy'
  4. 我该怎么做?

4 个答案:

答案 0 :(得分:1)

您可以通过PHP的diff()或msql datediff()

来检查日期差异

http://www.php.net/manual/en/datetime.diff.php

然后检查差异是零还是等于1或大于7

h 12-hour format of an hour with leading zeros 01 through 12 date('H:i:s')
i Minutes with leading zeros 00 to 59 
s Seconds, with leading zeros 00 through 59 

G 24-hour format of an hour without leading zeros 0 through 23 

USE DATE(G) to find AM or PM

if($TODAY)
date('h:i:s')PM
ELSE IF ($THISWEEK)
l (lowercase 'L') A
 full textual representation of the day of the week Sunday through Saturday 
ELSE IF($BEFOREONEWEEK)
date('d-m-y')

http://php.net/manual/en/function.date.php

这应该有效。希望如此: - )

答案 1 :(得分:1)

首先,您需要将MySQL时间转换为unix时间戳,这是大多数php日期函数使用的时间戳。如果您使用的是MySQLs DateTime类型,则可以使用MySQL函数unix_timestamp()mysql date functions在SQL中执行转换。或者你可以使用strtotime($ mysqlDateTime)函数php strtotime function

将mysql日期转换为PHP中的unix时间戳

一旦你有你想要格式化的时间的unix时间戳,转换就会像这样(86400是24小时内的秒数):

function displayDate($timestamp)
{
    $secAgo = time() - $timestamp;
    // 1 day
    if ($secAgo < 86400)
        return date('h:i:A', $timestamp);
    // 1 week
    if ($secAgo < (86400 * 7))
       return date('l', $timestamp);
    // older than 1 week
    return date('m/t/y', $timestamp);
}

此方法的好处是不需要在PHP中创建额外的对象(有点慢)或在SQL服务器上执行不必要的计算。也许有助于知道MySQL的时间戳类型将数据存储为unix时间戳(自1970年1月1日以来的秒数),与使用64位存储的日期时间相比,仅需要32位存储空间。对于每个人来说,32位应该足够了,直到2038年或其他什么......

答案 2 :(得分:1)

你只需要使用条件:

$now = new DateTime("now");
$ystrday = new DateTime("yesterday");
$weekAgo = new DateTime("now")->sub(new DateInterval('P7D'));
$inputDate = new DateTime(whenever);

if($yesterday < $inputDate and $inputDate < $now){
    $outDate = date('g:ia', $inputDate->getTimestamp() );
}else if($weekAgo < $inputDate and $inputDate < $now){
    $outDate = date('l', $inputDate->getTimestamp() );
}else if($inputDate < $weekAgo){
    $outDate = date('d/m/y', $inputDate->getTimestamp() );
}

这尚未经过测试,您需要将mySql日期转换为php DateTime对象,但它应该让您非常接近。

答案 3 :(得分:1)

我假设您正在讨论MySQL TIMESTAMP datatype,因为I don't think MySQL actually has a datatype like a Unix timestamp (i.e. seconds since epoch),所以您必须先使用strtotime function转换日期:

$timestamp = strtotime($dbTimestamp);

这将返回您可以使用的Unix timestamp

接下来,我们将定义几个时间戳来比较这个值:

首先,我们想知道今天午夜的时间戳。为此,您将字符串“today”传递给strtotime

$today = strtotime("today");

接下来,我们需要知道七天前的时间戳。您必须在"1 week ago""1 week ago midnight"之间进行选择。这两者之间的区别在于midnight将返回当天上午1​​2点的时间戳,而没有它的版本将在七天前返回当前时间(例如今天,差异将是是midnight将于4月7日上午12点返回,而非午夜版本将于4月7日下午3:45返回:

$weekAgo = strtotime("1 week ago midnight");

(注意,strtotime了解many formats,包括许多relative formats,例如上面使用的“今天”和“1周前”示例。)

接下来,我们需要定义要在每种情况下使用的date formats

$timeOnly = "g:i A"; // This gives an "hour:minute AM/PM" format, e.g. "6:42 PM"
$dayOfWeek = "l"     // Gives a full-word day of the week, e.g. "Sunday"
$mdy = "m/d/Y"       // gives two-digit month and day, and 4-digit year,
                     // separated by slashes, e.g. "04/14/2011"

最后,我们只是进行比较,并使用date function格式化我们的时间戳:

if ($timestamp >= $today) {
  $date = date($timeOnly, $timestamp);
} elseif ($timestamp >= $weekAgo) {
  $date = date($dayOfWeek, $timestamp);
} else {
  $date = date($mdy, $timestamp);
}

这将为您提供一个名为$date的字符串变量,其中包含数据库提供的相应格式的时间戳,您可以根据需要在页面上显示该时间戳。