【问题标题】:PHP strtotime() function off using "1-January-2013"使用“2013 年 1 月 1 日”关闭 PHP strtotime() 函数
【发布时间】:2013-12-31 03:36:20
【问题描述】:

我正在从注册表单中收集用户的生日,并希望在将其存储到数据库之前使用 strtotime 将其转换为时间戳,但这并不顺利。

我让他们在 3 个选择框中选择他们的日期,一个是日,另一个是月,最后是年,然后我将这些输入到 strtotime。问题是,我正在为之前列出的变量输入“1”、“January”和“2013”​​,并将它们输入到 strtotime 中,如下所示:

$user->birthday = strtotime($input['bday'].'-'.$input['bmonth'].'-'.$input['byear']);

这在回显为“2013 年 1 月 1 日”时读取,但它吐出的时间戳呈现为“2012 年 12 月 31 日”,使用:

date_default_timezone_set("America/Los_Angeles");
echo date("M d, Y", 1356998400);

我一直在大量测试不同的方法,但无法让它发挥作用。如有任何帮助,我将不胜感激。

【问题讨论】:

  • 在打电话给strtotime之前你打电话给date_default_timezone_set了吗?
  • 我相信我的框架设置了这一点。它设置为 UTC。
  • 所以你正在处理 UTC 中的输入日期,然后在 LA 时间回显它。当格林威治 1 月 1 日时,洛杉矶仍然是 12 月 31 日。
  • 哦,射击...*掌心*...天哪..谢谢。 xD

标签: php mysql string time


【解决方案1】:

您是在调用 strtotime() 之前还是之后设置 date_default_timezone_set()?由于默认时区是 UTC,而 LA 是 UTC-08.00,这可能是造成差异的原因。

【讨论】:

  • 问题应该在cmets中提问。我知道,您还没有足够的代表发表评论。不过这个问题我已经问过了,你不用问了。
  • 是的,就是这样,谢谢。不幸的是,Barmar 先解决了它,否则我会接受。
【解决方案2】:

您必须在调用strtotime 之前调用date_default_timezone_set,以便在解析输入日期和显示日期时具有相同的时区。

【讨论】:

  • 感谢 Barmar,抱歉这个愚蠢的问题。
【解决方案3】:

不太确定您的代码是如何失败的,但这对我有用:

// Set the test data.
$test_data = '1-January-2013';

// Get the Unix datetime from the test data.
$date = strtotime($test_data);

// Format the Unix datetime.
$dateFormat = date("M d, Y", $date);  

// Output for debugging.
echo 'test_data: ' . $date . '<br />';
echo 'date: ' . $date . '<br />';
echo 'dateFormat: ' . $dateFormat . '<br />';

我这边使用 PHP 5.5 的输出是:

test_data: 1357016400
date: 1357016400
dateFormat: Jan 01, 2013

但在外部机会那些- 破折号令人窒息,试试这个:

// Set the test data.
$test_data = '1-January-2013';

// Filter out dashes from the '$test_data'
$test_data = preg_replace('/-/', ' ', $test_data);

// Get the Unix datetime from the test data.
$date = strtotime($test_data);

// Format the Unix datetime.
$dateFormat = date("M d, Y", $date);  

// Output for debugging.
echo 'test_data: ' . $date . '<br />';
echo 'date: ' . $date . '<br />';
echo 'dateFormat: ' . $dateFormat . '<br />';

再一次,我这边使用 PHP 5.5 的输出是:

test_data: 1357016400
date: 1357016400
dateFormat: Jan 01, 2013

【讨论】:

  • 你得到这个时间戳了吗?也许这是我的环境......“1356998400”
  • 对我来说echo date(strtotime("1".'-'."January".'-'."2013")); 给了1356994800
  • 13569948001357016400 的区别基于本地时区。但正如您所见,我的代码按预期工作。
  • 但是当我检查所有的时间戳时,它们的结果都是 2013 年 1 月 1 日。
  • 好吧,抱歉,正如 Barmar 所说,这是因为我输入的是 UTC,输出的是 PST-8。我的错。对不起!
【解决方案4】:

这绝对是时区问题。 1356998400 是 01 / 01 / 13 @ 12:00:00am UTC,所以当你这样做时:

date_default_timezone_set("America/Los_Angeles");
echo date("M d, Y", 1356998400);

Unix 时间 1356998400 2012 年 12 月 31 日在洛杉矶!我怀疑您正在获取 UTC 时间戳,然后使用 PST 输出它。

【讨论】:

  • 是的,事情就是这样。再次感谢。不幸的是,Barmar 先得到了它,所以我会接受他的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多