【发布时间】:2014-09-03 01:18:13
【问题描述】:
如何使用 php 将 js 日期(如 Sun Jul 13 2014 07:00:00 GMT+0200 (EET))转换为 MySQL 格式(如 2014-07-13 07:00:00)?
【问题讨论】:
标签: javascript php mysql timestamp
如何使用 php 将 js 日期(如 Sun Jul 13 2014 07:00:00 GMT+0200 (EET))转换为 MySQL 格式(如 2014-07-13 07:00:00)?
【问题讨论】:
标签: javascript php mysql timestamp
由于您的日期字符串已经包含时区,您不需要做任何特别的事情:
$when = new DateTime('Sun Jul 13 2014 07:00:00 GMT+0200 (EET)');
echo $when->format('Y-m-d H:i:s');
正如在 cmets 中有用地指出的那样,这个字符串实际上包含两位时区信息,UTC + 2 和 EET(东欧时间),PHP 基本上忽略了第二个。在此示例中可以更好地发现:
var_dump(new DateTime('Sun Jul 13 2014 07:00:00 GMT+0200 (EET)'), DateTime::getLastErrors());
var_dump(new DateTime('Sun Jul 13 2014 07:00:00 GMT+0200'), DateTime::getLastErrors());
var_dump(new DateTime('Sun Jul 13 2014 07:00:00 (EET)'), DateTime::getLastErrors());
object(DateTime)#1 (3) {
["date"]=>
string(26) "2014-07-13 07:00:00.000000"
["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+02:00"
}
array(4) {
["warning_count"]=>
int(1)
["warnings"]=>
array(1) {
[34]=>
string(29) "Double timezone specification"
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
object(DateTime)#1 (3) {
["date"]=>
string(26) "2014-07-13 07:00:00.000000"
["timezone_type"]=>
int(1)
["timezone"]=>
string(6) "+02:00"
}
array(4) {
["warning_count"]=>
int(0)
["warnings"]=>
array(0) {
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
object(DateTime)#1 (3) {
["date"]=>
string(26) "2014-07-13 07:00:00.000000"
["timezone_type"]=>
int(2)
["timezone"]=>
string(3) "EET"
}
array(4) {
["warning_count"]=>
int(0)
["warnings"]=>
array(0) {
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
我们实际上需要剥离其中一个,例如:
$js_date_string = 'Sun Jul 13 2014 07:00:00 GMT+0200 (EET)';
// Regular expression is shown for illustration purposes, it's probably wrong!
$tmp_date_string = preg_replace('/ GMT\+\d{4}/ui', '', $js_date_string);
$when = new DateTime($tmp_date_string);
var_dump($when, DateTime::getLastErrors());
echo $when->format('Y-m-d H:i:s');
object(DateTime)#1 (3) {
["date"]=>
string(26) "2014-07-13 07:00:00.000000"
["timezone_type"]=>
int(2)
["timezone"]=>
string(3) "EET"
}
array(4) {
["warning_count"]=>
int(0)
["warnings"]=>
array(0) {
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
2014-07-13 07:00:00
【讨论】:
Mon May 04 2020 00:00:00 GMT+0200 (Central European Summer Time)。尝试创建新的DateTime 时收到错误Double timezone specification。
GMT+0100 (Central European Summer Time)。在您的示例中,该字符串也有两个时区GMT+0200 和EET,但这出于某种原因。
EET 部分。也许我们只是在解析器的代码中遇到了一个漏洞。
我会尽量加强@akuzminsky 的回答。由于date_parse在内部使用strtotime来解析日期,所以你可以直接使用它,让你的代码更加灵活。
有一个小缺点,因为您需要设置时区才能正确使用date 并避免 php 警告。我将它设置为Europe/Athens,但你可以找到here所有可用的代码。
date_default_timezone_set("Europe/Athens");
$unixTimeStamp = strtotime("Sun Jul 13 2014 07:00:00 GMT+0200 (EET)");
$newFormat = date('Y-m-d H:i:s', $unixTimeStamp );
echo $newFormat;
【讨论】:
Javascript: 现在可以在几秒钟内获得这个时间。除以 1000 消除毫秒数
var time = new Date().getTime() / 1000
PHP:使用JS返回的时间,整数值
$time = gmdate('H:i:s', time)
【讨论】:
<?php
print_r(date_parse("Sun Jul 13 2014 07:00:00 GMT+0200"));
?>
Array
(
[year] => 2014
[month] => 7
[day] => 13
[hour] => 7
[minute] => 0
[second] => 0
[fraction] => 0
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 0
[errors] => Array
(
)
[is_localtime] => 1
[zone_type] => 1
[zone] => -120
[is_dst] =>
[relative] => Array
(
[year] => 0
[month] => 0
[day] => 0
[hour] => 0
[minute] => 0
[second] => 0
[weekday] => 0
)
)
【讨论】: