MySQL和PHP之间的日期

MySQL和PHP之间的日期,php,mysql,date,Php,Mysql,Date,我在MySQL数据库中有一个带有日期类型字段的表。我的用户将日期放入一个字段(格式为dd-mm-yyy),我将其转换为yyy-mm-dd以插入数据库。这个很好用。我可以在那里看到日期(例如)2012-04-04 我的问题是,然后选择此记录,将日期转换为我希望显示的格式(dd-mm-yyyy),并获得2012年4月3日。我理解为什么,因为我的数据库设置为UTC,但是用户在柏林时间,因此柏林的04-04-2012 00:00是03-04-2012 23:00 UTC 该问题意味着,如果我随后保存显示

我在MySQL数据库中有一个带有日期类型字段的表。我的用户将日期放入一个字段(格式为dd-mm-yyy),我将其转换为yyy-mm-dd以插入数据库。这个很好用。我可以在那里看到日期(例如)2012-04-04

我的问题是,然后选择此记录,将日期转换为我希望显示的格式(dd-mm-yyyy),并获得2012年4月3日。我理解为什么,因为我的数据库设置为UTC,但是用户在柏林时间,因此柏林的04-04-2012 00:00是03-04-2012 23:00 UTC

该问题意味着,如果我随后保存显示的日期(2012年4月3日),下次看到它时,它将显示为2012年4月2日,因为我只保存了日期,因此系统再次假定为00:00时间


除了将其设置为datetime类型而不是date类型之外,我看不到其他解决方法,但是我不希望这样做,因为时间(出于各种原因)存储在单独的字段中。有什么建议吗?

当您插入一条记录,并将其添加为日期时间当前UTC时间,之后,其配置文件中的每个用户都可能希望/或设置其时区

如果您知道用户的时区,您可以轻松地将datetime转换为用户区域设置时间。因为你知道时间之间的小时/分钟差异

另外,您可以将日期时间存储为varchar,并将unix时间戳保存在此字段中。我认为Unix时间戳是基于当前时区的

更新: 我想这可能会有帮助

$date = time();
dump(date('d-m-Y H:i:s', $date)); // 03-04-2012 08:43:38

date_default_timezone_set('Europe/London');
dump('London: '. date('d-m-Y H:i:s', $date)); // London: 03-04-2012 11:43:38

date_default_timezone_set('Europe/Berlin');
dump('Berlin: '. date('d-m-Y H:i:s', $date)); // Berlin: 03-04-2012 12:43:38

date_default_timezone_set('Europe/Sofia');
dump('Sofia: '. date('d-m-Y H:i:s', $date)); // Sofia: 03-04-2012 13:43:38

dump函数返回
''$有些东西。”

UTC是国际时间标准。它与格林威治标准时间(GMT)相似,只是UTC不遵守夏令时(DST),而是基于24小时时钟。UTC的零(0)小时是格林尼治标准时间的午夜。根据与本初子午线相关的位置以及当地夏时制的考虑因素,通过增加或减少小时数,将当地24小时时间惯例转换为UTC。

首先,确保两个时区相同。然后,不要以
datatime
格式存储,使用整数。将日期转换为时间戳,然后存储。像

$time = time(); //get the current time stamp
//Now insert $time
echo gmdate("M d Y H:i:s", $time);
现在,这两个地方有共同点,你可以随心所欲。在不同的时区之间更改日期相当容易


如何选择和转换它?我的select语句不寻求修改日期。我使用日期('d-m-Y',$startdate)来显示。即使您实际上没有显示时间部分,您是否可以在生成日期时使用它?这样,当您为用户设置格式时,日期应该是正确的。是的,这可能是最终结果。只是想知道是否有一个简单的解决方案,我不知道。我从不认为我知道所有的答案,但我通常发现stackoverflow知道!这是正确的,但是问题是数据有一个独立于用户的时区。这并不是一张“显示所有时间戳为纽约时间,因为我所在的地方”,而是这张记录是纽约,这张是柏林,这张是伦敦等,因此显示这些时区的时间。但是,我认为除了在记录的基础上转换UTC和转换UTC之外,别无选择……我非常感谢额外的注释。有时我会显示200个结果,不断更改默认时区似乎有些过头了。我发现了一个关于如何在不干扰默认设置的情况下进行逐案转换的小教程。也就是说,我将保留默认值作为用户位置,并在运行中弄乱显示的时间参数。谢谢,这将起作用,除非我需要能够跨越时区,所以为了简单起见,必须支持UTC…@ChrisHardaker,你不知道这有多容易。请参阅我的updateSorry,但是您是正确的,因为我只看到了这方面的问题。根据我对您的解决方案的了解,我消除了对其他时区的所有意识。我确实想在纽约的柏林时间向他们展示一些东西,但是我不想在纽约展示柏林过去的东西。我想以你为例,我会在纽约上午9点看到,柏林计划在上午10点举行的活动,但在柏林是下午5点,因此活动已经结束。最终的结果是,对我来说,使用“日期”数据类型是一个糟糕的设计决策,所以我现在付出了代价。。。