php时间戳utc

php时间戳utc,php,mysql,datetime,timestamp,Php,Mysql,Datetime,Timestamp,我有一个PHP MySQL查询,它将一些数据插入MySQL数据库,并包含一个时间戳 当前,INSERT查询对时间戳列使用NOW(),并以以下格式保存在数据库中:2012-07-24 13:13:02 不幸的是,服务器不在我的时区,它被列为美国/洛杉矶,如图所示print date\u default\u timezone\u get() 我希望做到以下几点: date_default_timezone_set('Europe/London'); $timefordbLondonEU = date

我有一个PHP MySQL查询,它将一些数据插入MySQL数据库,并包含一个时间戳

当前,
INSERT
查询对时间戳列使用
NOW()
,并以以下格式保存在数据库中:
2012-07-24 13:13:02

不幸的是,服务器不在我的时区,它被列为美国/洛杉矶,如图所示
print date\u default\u timezone\u get()

我希望做到以下几点:

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time());
只需将
$timefordbLondonEU
保存到数据库中,以代替
NOW()

这是保存此类数据的好方法吗

非常感谢,

理查德

[添加文本]

我将MySQL数据库中的类型更改为
DateTime
,并执行了以下操作:

date_default_timezone_set('Europe/London');
$timefordbLondonEU = date('Y-m-d H:i:s', time()); 
这是工作,但我仍然没有得到的整体概念尚未

Assumptions based on your comments:
  • MySQL=没有UTC数据类型,您只需使用INT类型即可
  • Unix_TimeStamp()将保存当前时间或计数?采用UTC格式,如1343247227
  • 由于UTC是从一个公共0点开始的计数,因此您可以从中获得任何时区。假设您不希望日期早于1970年的参考0点
  • 根据您所说的我的猜测和引导,最好的方法是将时间保存为INT(1343247227)中的UTC,然后从中生成您想要的任何时区。再次假设您不需要存储1970年参考0点之前的日期


    同样,为什么不在已知时区存储为datetime YYYY-MM-DD HH:MM:SS,然后转换为UTC或其他时区呢。这一切看起来都很混乱=(

    正如@Petah在评论中所说,将时间存储在UTC中,并根据需要在应用程序中隐藏它们

    Unix时间戳以UTC为单位,因此我通常将时间作为时间戳存储在数据库中。这避免了在选择时先转换为UTC再转换为UTC的麻烦和混乱

    也就是说,将时间字段设置为
    INT
    类型,并在插入时使用MySQL中的函数
    UNIX\u TIMESTAMP()
    ,或者使用该函数从PHP获取时间戳

    当您从数据库中获取时间戳时,它将以UTC为单位,但当您使用
    date()
    在PHP应用程序中显示它时,它将显示在服务器时区中,或使用
    date\u default\u timezone\u set设置的任何内容中

    因此,以下两个查询将起作用:

    INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP());
    
    // or
    
    $time = time();
    
    $query = "INSERT INTO `table` (id, time) VALUES(NULL, $time);
    
    如果要从数据库中选择它作为日期时间,可以执行以下操作:

    SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1
    
    生成的
    dt
    列的格式为
    yyyy-MM-dd hh:MM:ss

    您可以使用PHP格式化数字时间戳

    如果您使用的PHP版本是64位的,那么您不局限于1970-2036范围,PHP将支持64位时间戳,在这种情况下,请确保在MySQL中使用
    BIGINT


    希望这能有所帮助。

    将所有时间存储为UTC,然后在外出时将其转换为所需的时间。或者,如果您不需要存储1970年之前的日期,可以将其存储为Unix时间戳,方法是将字段设置为
    INT
    。好的,这可能让我现在更加困惑。但是我将MySQL中的类型更改为DateTime,并执行了以下操作:date_default_timezone_set('Europe/London');$timefordbLondonEU=date('Y-m-d H:i:s',time());它可以工作,但我仍然没有真正了解它。假设:MySQL=没有UTC的数据类型,所以您使用INT.Unix_TimeStamp()类型是否将保存当前时间或计数?采用UTC格式,如1343247227。由于UTC是从一个公共0点开始的计数,您可以从中获取任何时区?MySQL
    DATETIME
    列只是
    YYYY-MM-DD HH:MM:SS
    格式中的一列,时区不相关。它可以是UTC,也可以是任何其他时区。Unix时间戳(在MySQL中存储为INT或BIGINT)是整数,并且始终以UTC为单位。它们是自1970年UTC 1月1日午夜以来经过的秒数。由于它们始终以UTC为单位,因此可以很容易地与给定时区进行转换。
    UNIX\u TIMESTAMP()
    在MySQL中,将当前时间戳保存为UTC。这是否消除了任何混淆或使其变得更糟?是的,它正在到达那里=D我想唯一的问题是选择您想要的时区并从那里开始。不再是UTC的真正粉丝,似乎如果您选择一个时区并将其用作DateTime格式的参考,您可以随时进行操作如果您需要,可以在不受1970年限制的情况下进行区域转换或日期更改。我猜,如果需要,您可以随时将时区转换为UTC。仅使用datetime有任何缺点吗?再次感谢您的帮助,顺便说一句!!时间戳的好处是,您可以从数据库中获取时间戳,并将其与PHP date funct一起使用此外,时区到服务器时间的转换是自动的。以非UTC格式存储为日期时间需要额外的步骤,将其从存储的时区转换为用户或服务器时区,或者转换为UTC以使用w/PHP日期函数。w/64位PHP,无需担心1970年的限制,您可以为之前的日期设置负时间戳1970年,截止年份是292277026596,所以这不应该是一个问题。由于时间戳是UTC,所以存储在UTC中是非常通用的。