将PHP日期发送到JavaScript日期格式

31

我想把我的PHP服务器时间传递到JavaScript文件中。

PHP 代码:

date_default_timezone_set('Australia/Perth');
echo date("r");

JavaScript:

$.get('time.php', function(data) {
  today = new Date(data);
  closing = new Date(data);
});

这段 PHP 代码返回了澳大利亚/珀斯的正确时间:Sun, 18 Mar 2012 12:01:23 +0800。但是它返回了一个无效的 JavaScript 日期对象。

当我尝试将其转换为时间戳时:

 echo strtotime(date("r"));

我得到了 JavaScript 日期 Sun Mar 18 2012 04:03:14 GMT+0000 (WET)(这是今天的js变量值)

如果我使用:

echo gmstrftime('%s');

我得到的是:Sat Mar 17 2012 20:04:30 GMT+0000 (WET)。

请问有人可以帮助我吗?


1
为什么不直接使用PHP的time()函数呢? - Austin Brunkhorst
这是同样的事情,@AustinBrunkhorst今天返回Sun Mar 18 2012 04:20:17 GMT+0000(WET) - jribeiro
9个回答

61

Luna的回答中使用echo date的PHP代码与JavaScript代码并不完全相同。以下代码将完全模拟JavaScript代码:

echo date('D M d Y H:i:s O');

7
在 JavaScript 中我看到的格式不是这样的。我看到的格式是:date('D M d Y H:i:s \G\M\TO (T)'); - Kevin Beal

13

你也可以直接保留 PHP 代码,然后使用 JavaScript 解析日期:

var date = new Date(Date.parse(DATE));

然后,即使像这样的事情也可以正常工作:

new Date(Date.parse('11 March 2017'));

这将通过控制台日志输出(GMT+1000是因为我在澳大利亚):

Sat Mar 11 2017 00:00:00 GMT+1000

有关 Date.parse() 的更多信息请点击这里: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/parse


使用内置解析器解析不受支持的格式并不是一个好主意,因为解析是实现相关的,可能会在意想不到且难以发现的情况下失败。 - RobG
1
链接已损坏(伴随着相当有趣的 404 PNG 动画):“未找到。很抱歉,我们无法找到您要查找的内容。” - Peter Mortensen

10
$.get('time.php', function(data) {
  today = new Date(data);
  closing = new Date(data);
});

将字符串乘以1000的目的是什么?这个操作没有意义。

以下PHP代码可以用于此操作。

echo date('D, d M y H:i:s')." +0000";

它是用来转换Unix时间戳的(因为有毫秒),但我忘了删除。无论如何,它返回Sun Mar 18 2012 04:10:32 GMT+0000 (WET),而PHP返回Sun,18 Mar 2012 12:10:32 +0800。谢谢。 - jribeiro
我需要将我的JavaScript日期对象设置为Sun, 18 Mar 2012 12:10:32,以便所有后续的计算能够正常工作! - jribeiro

7
date('D M d Y H:i:s O')

如果当前的语言环境不是英语,这将无法运行。

一个更好的选择是使用:

new Date(<? echo date("Y, n - 1, d, H, i, s") ?>)

5
警告:PHP 返回从1到12编号的月份,但 Javascript 使用0到11。这将始终给您一个月份旧的时间戳。此外,不能简单地从JS日期对象中减去一个月,因为Javascript会在构建时“纠正”日期...如果您在1月31日运行此代码,Javascript将得到“2月31日”,然后纠正为3月3日(假设2月有28天)。 - Aaron Cicali
关于“当前语言环境不是英语”的提示:您的意思是“当前语言环境不是美式英语”吗? - Peter Mortensen
英语是一种语言,而不是一个区域设置。 - RobG

5

以下是一个使用DateTime对象的示例:

PHP代码(适用于PHP 5.3或更高版本)

$serverDate = new \DateTime('NOW');

// If you want to set a different time zone
// $serverDate = new \DateTime('NOW', new \DateTimeZone('Australia/Perth'));
echo $serverDate->format(DATE_ATOM);

JavaScript 代码

$.get('time.php', function(data) {
  var serverDate = new Date(data);
});

3
一个好的方法是时间戳:
echo $data = time()*1000;
echo '
  <div id="setxDatetime">The current server time is: </div>
  <script type="text/javascript">
    var x = document.getElementById("setxDatetime");
    x.innerHTML = x.innerHTML + new Date(' . $data . ');
  </script>
';

1381324693000

当前服务器时间为:2013年10月09日星期三,GMT+0300(GTB标准时间)16:18:13。


2

可能有更好的解决方案,但这个对我很有效。关键问题在于JavaScript使用0-11表示月份,而PHP使用1-12,如前所述。

function convert_date_php_js($date) {
    $converted_date = date("Y", strtotime($date)) . ', ' .
                      (date("n", strtotime($date))-1) . ', ' .
                      date("j", strtotime($date));
    return $converted_date;
}

$priceDate = "2016-09-14";
$d = convert_date_php_js($priceDate);
// Returns 2016, 8, 14

-1

对我有效的方法是:

<?php $today = date("Y/m/d H:i:s"); ?>

<script>new Date(Date.parse('<?php echo $today; ?>'))</script>

这正是第二个答案中建议的。请考虑阅读现有的答案,只有在它能够提供新的信息时再添加另一个答案。 - Your Common Sense
我不同意。对我来说,不同的PHP格式无法正常工作,并且它的示例中没有使用Date.parse - Loosie94
实际上,它是这样的:链接 - Your Common Sense

-4

非常简单:

new Date("<?= date('Y/m/d H:i:s'); ?>");

1
这个答案并没有比其他答案更好或更出色。 - Machavity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接