Mysql时间 - 2小时

时间:2015-04-20 09:17:59

标签: php time timestamp

我在数据库中有一个存储日期的表,但是采用这种格式

2015-04-20 12:47:58

我需要回应这个时间但是-2小时,任何解决方案?我知道在db中使用timestamp会更容易,但我无法访问将日期插入其中的脚本。

    if ( !defined('IN_HLSTATS') )
    {
        die('Do not access this file directly.');
    }
// Global Server Chat History
    $showserver=0;
    if (isset($_GET['server_id']))
    {
        $showserver = valid_request(strval($_GET['server_id']), true);
    }
    if ($showserver == 0)
    {
        $whereclause = "hlstats_Servers.game='$game'";
    }
    else
    {
        $whereclause = "hlstats_Servers.game='$game' AND hlstats_Events_Chat.serverId=$showserver";
    }
    $db->query
    ("
        SELECT
            hlstats_Games.name
        FROM
            hlstats_Games
        WHERE
            hlstats_Games.code = '$game'
    ");
    if ($db->num_rows() < 1) error("No such game '$game'.");
    list($gamename) = $db->fetch_row();
    $db->free_result();
    pageHeader
    (
        array ($gamename, 'Server Chat Statistics'),
        array ($gamename=>"%s?game=$game", 'Server Chat Statistics'=>'')
    );
    flush();
    $servername = "(All Servers)";

    if ($showserver != 0)
    {
        $result=$db->fetch_array
        (
            $db->query
            ("
                SELECT
                    hlstats_Servers.name
                FROM
                    hlstats_Servers
                WHERE
                    hlstats_Servers.serverId = ".$db->escape($showserver)."
            ")
        );
        $servername = "(" . $result['name'] . ")";
    }
?>

<div class="block">
    <?php printSectionTitle("$gamename $servername Server Chat Log (Last ".$g_options['DeleteDays'].' Days)'); ?>
    <div class="subblock">
        <div style="float:left;">
            <span>
            <form method="get" action="<?php echo $g_options['scripturl']; ?>" style="margin:0px;padding:0px;">
                <input type="hidden" name="mode" value="chat" />
                <input type="hidden" name="game" value="<?php echo $game; ?>" />
                <strong>&#8226;</strong> Show Chat from
                <?php
/*
                    $result = $db->query
                    ("
                        SELECT
                            DISTINCT hlstats_Events_Chat.serverId,
                            hlstats_Servers.name
                        FROM
                            hlstats_Events_Chat
                        INNER JOIN
                            hlstats_Servers
                        ON
                            hlstats_Events_Chat.serverId = hlstats_Servers.serverId
                            AND hlstats_Servers.game='$game'
                        ORDER BY
                            hlstats_Servers.sortorder,
                            hlstats_Servers.name,
                            hlstats_Events_Chat.serverId ASC
                        LIMIT
                            0,
                            50
                    ");
*/

                    $result = $db->query
                    ("
                        SELECT
                            hlstats_Servers.serverId,
                            hlstats_Servers.name
                        FROM
                            hlstats_Servers
                        WHERE
                            hlstats_Servers.game='$game'
                        ORDER BY
                            hlstats_Servers.sortorder,
                            hlstats_Servers.name,
                            hlstats_Servers.serverId ASC
                        LIMIT
                            0,
                            50
                    ");

                    echo '<select name="server_id"><option value="0">All Servers</option>';
                    $dates = array ();
                    $serverids = array();
                    while ($rowdata = $db->fetch_array())
                    {
                        $serverids[] = $rowdata['serverId'];
                        $dates[] = $rowdata; 
                        if ($showserver == $rowdata['serverId'])
                            echo '<option value="'.$rowdata['serverId'].'" selected>'.$rowdata['name'].'</option>';
                        else
                            echo '<option value="'.$rowdata['serverId'].'">'.$rowdata['name'].'</option>';
                    }
                    echo '</select>';
                    $filter=isset($_REQUEST['filter'])?$_REQUEST['filter']:"";
                ?>
                Filter: <input type="text" name="filter" value="<?php echo htmlentities($filter); ?>" /> 
                <input type="submit" value="View" class="smallsubmit" />
            </form>
            </span>
        </div>
    </div>
    <div style="clear:both;padding-top:20px;"></div>
        <?php
            if ($showserver == 0)
            { 
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=17&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=34&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'serverName',
                            'Server',
                            'width=23&sort=no'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=10&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            else
            {
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=24&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=44&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=16&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            $whereclause2='';
            if(!empty($filter))
            {
                $whereclause2="AND MATCH (hlstats_Events_Chat.message) AGAINST ('" . $db->escape($filter) . "' in BOOLEAN MODE)";
            }
            $surl = $g_options['scripturl'];

            $result = $db->query
            ("
                SELECT SQL_NO_CACHE 
                    hlstats_Events_Chat.eventTime,
                    unhex(replace(hex(hlstats_Players.lastName), 'E280AE', '')) as lastName,
                    IF(hlstats_Events_Chat.message_mode=2, CONCAT('(Team) ', hlstats_Events_Chat.message), IF(hlstats_Events_Chat.message_mode=3, CONCAT('(Squad) ', hlstats_Events_Chat.message), hlstats_Events_Chat.message)) AS message,
                    hlstats_Servers.name AS serverName,
                    hlstats_Events_Chat.playerId,
                    hlstats_Players.flag,
                    hlstats_Events_Chat.map
                FROM
                    hlstats_Events_Chat
                INNER JOIN
                    hlstats_Players
                ON
                    hlstats_Players.playerId = hlstats_Events_Chat.playerId
                INNER JOIN 
                    hlstats_Servers
                ON
                    hlstats_Servers.serverId = hlstats_Events_Chat.serverId
                WHERE
                    $whereclause $whereclause2
                ORDER BY
                    hlstats_Events_Chat.id $table->sortorder
                LIMIT
                    $table->startitem,
                    $table->numperpage;
            ", true, false);
/*
                $whereclause = "hlstats_Events_Chat.serverId ";

            if($showserver == 0) {
                $whereclause .= "in (".implode($serverids,',').")";
            } else {
                $whereclause .= "= $showserver";
            }
*/

            $db->query
            ("
                SELECT
                    count(*)
                FROM
                    hlstats_Events_Chat
                INNER JOIN
                    hlstats_Players
                ON
                    hlstats_Players.playerId = hlstats_Events_Chat.playerId
                INNER JOIN 
                    hlstats_Servers
                ON
                    hlstats_Servers.serverId = hlstats_Events_Chat.serverId
                WHERE
                    $whereclause $whereclause2
            ");
            if ($db->num_rows() < 1) $numitems = 0;
            else 
            {
                list($numitems) = $db->fetch_row();
            }
            $db->free_result(); 

            $table->draw($result, $numitems, 95);
        ?><br /><br />
    <div class="subblock">
        <div style="float:right;">
            Go to: <a href="<?php echo $g_options["scripturl"] . "?game=$game"; ?>"><?php echo $gamename; ?></a>
        </div>
    </div>
</div>

eventTime是db中具有日期

的字段
if ($showserver == 0)
            { 
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=17&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=34&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'serverName',
                            'Server',
                            'width=23&sort=no'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=10&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }
            else
            {
                $table = new Table(
                    array
                    (
                        new TableColumn
                        (
                            'eventTime',
                            'Date',
                            'width=16'
                        ),
                        new TableColumn
                        (
                            'lastName',
                            'Player',
                            'width=24&sort=no&flag=1&link=' . urlencode('mode=playerinfo&amp;player=%k')
                        ),
                        new TableColumn
                        (
                            'message',
                            'Message',
                            'width=44&sort=no&embedlink=yes'
                        ),
                        new TableColumn
                        (
                            'map',
                            'Map',
                            'width=16&sort=no'
                        )
                    ),
                    'playerId',
                    'eventTime',
                    'lastName',
                    false,
                    50,
                    "page",
                    "sort",
                    "sortorder"
                );
            }

5 个答案:

答案 0 :(得分:0)

使用INTERVAL:

SELECT date - INTERVAL 2 HOUR FROM yourtable

返回:2015-04-20 10:47:58

首先尝试这种方式看它是否有效,甚至不命名表或字段,只选择:

SELECT '2015-04-20 12:47:58' - INTERVAL 2 HOUR 

给予:2015-04-20 10:47:58

在PHP中,您需要执行此查询:

$result = $db->query('SELECT eventTime - INTERVAL 2 HOUR AS newdate FROM hlstats_Events_Chat');
while($row = $result->fetch_assoc()){
    echo $row['newdate'];
}

答案 1 :(得分:0)

使用DATE_SUB功能,您可以从日期时间字段值中减去时间间隔:

SELECT DATE_SUB(columnname, INTERVAL 2 HOUR) FROM tablename

答案 2 :(得分:0)

使用DateTime对象:

<?php
// Long version
$str = '2015-04-20 12:47:58'; // Your date
$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $str); // Conversion to DateTime object
$dateTime->sub(new DateInterval('PT2H')); // Substract 2 hours
$formatedDate = $dateTime->format('Y-m-d H:i:s'); // Formatting the new date

// Short version
$formatedDate = DateTime::createFromFormat('Y-m-d H:i:s', $str)->sub(new DateInterval('PT2H'))->format('Y-m-d H:i:s');
?>

答案 3 :(得分:0)

使用INTERVAL或DATE_SUB

SELECT '2015-04-20 12:47:58' - INTERVAL 2 HOUR;
SELECT DATE_SUB('2015-04-20 12:47:58', INTERVAL 2 HOUR);

SQL小提琴http://sqlfiddle.com/#!9/9eecb/7404

答案 4 :(得分:0)

对我来说听起来像是时区问题?

您可以在查询之前使用mysql set time_zone = '-02:00';

SELECT NOW();
SET time_zone = '-02:00';
SELECT NOW();

但是你可能想要在你的时区中获得时间,即你的数据库设置是-2小时。

$dbDate = '2015-04-20 12:47:58';
$dbTimezone = 'UTC'; // ?
$yourTimezone = 'Europe/Amsterdam'; // that's where i am (UTC +2)

$newDate = new DateTime($dbDate, new DateTimeZone($dbTimezone));
$newDate->setTimeZone(new DateTimeZone($yourTimezone));

echo $newDate->format('Y-m-d H:i:s'); // will echo UTC + 2 in this case..