【问题标题】:PHP convert date format dd/mm/yyyy => yyyy-mm-dd [duplicate]PHP转换日期格式dd/mm/yyyy => yyyy-mm-dd [重复]
【发布时间】:2012-05-05 15:01:43
【问题描述】:

我正在尝试从dd/mm/yyyy => yyyy-mm-dd 转换日期。我使用了 mktime() 函数和其他函数,但我似乎无法使其工作。我已经设法使用'/' 作为分隔符来explode 原始日期,但我没有成功更改格式并将'/''-' 交换。

任何帮助将不胜感激。

【问题讨论】:

  • 试试这个 $old_date = "20/04/2012"; $new_date = date("Y-m-d", strtotime($old_date) );

标签: php date formatting mktime


【解决方案1】:

m/d/yd-m-y 格式的日期可以通过查找来消除歧义 在各个组件之间的分隔符处:如果分隔符是 斜杠 (/),则假定为美式 m/d/y;而如果 分隔符是破折号 (-) 或圆点 (.),然后是欧式 d-m-y 假定格式。检查more here

使用默认日期函数。

$var = "20/04/2012";
echo date("Y-m-d", strtotime($var) );

编辑 我刚刚测试过,不知何故,PHP 不能很好地处理 dd/mm/yyyy 格式。这是另一个解决方案。

$var = '20/04/2012';
$date = str_replace('/', '-', $var);
echo date('Y-m-d', strtotime($date));

【讨论】:

  • 如果我使用 dd/mm/yyyy 格式,这里只得到 1970-01-01。 mm/dd/yyyy 格式可以使用此代码。
  • @SibirajPR m/d/y 或 dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则美国 m假设 /d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。 在此处查看更多信息:php.net/manual/en/function.strtotime.php
  • 这看起来不错,但不是。 05/04/2045 将假定为美国并给出 5 月 4 日而不是 4 月 4 日。根据 hjpotter 的说法,这是一个间歇性且危险的错误。此答案应标记为错误。
  • $var = '20/04/2012'; $date = str_replace('/', '-', $var); echo date('Y-m-d', strtotime($date)); // 这个解决方案对我来说适用于 dd/mm/yy
  • strtotime() 在 mm-dd-yyyy 和 dd-mm-yyyy 之间有何不同
【解决方案2】:

尝试使用DateTime::createFromFormat

$date = DateTime::createFromFormat('d/m/Y', "24/04/2012");
echo $date->format('Y-m-d');

输出

2012-04-24

编辑:

如果日期是 2010 年 5 月 4 日(D/M/YYYY 或 DD/MM/YYYY),则使用以下方法将 5/4/2010 转换为 2010-4-5(YYYY-MM -DD 或 YYYY-MD) 格式。

$old_date = explode('/', '5/4/2010'); 
$new_data = $old_date[2].'-'.$old_date[1].'-'.$old_date[0];

输出:

2010-4-5

【讨论】:

  • 当你有 mm/dd/yyyy 格式并想转换 yyyy-mm-dd 格式时,试试这个。这对我有用。 $var1 = "03/01/2014"; $date = DateTime::createFromFormat('m/d/Y', $var1); $travel_date = $date->format('Y-m-d');输出=“2014-03-01”
  • 这是所有日期问题最灵活的解决方案。我怎么能错过这么多年。谢谢!
  • 这应该是正确答案
【解决方案3】:

这是另一个不使用 date() 的解决方案。没那么聪明:)

$var = '20/04/2012';
echo implode("-", array_reverse(explode("/", $var)));

【讨论】:

  • 如果不聪明,为什么这么聪明。我根本看不出这个解决方案有任何问题,而且它省去了在日期和地点方面的麻烦。每次都有保证的性能。
  • @tosin 非常有创意的解决方案!
  • 只有当他们像 05/04/2010 这样添加 0 时才有效,如果他们在 2010 年 5 月 4 日写它就行不通了。
  • @Shadowbob,OP 要求进行 dd/mm/yyyy 转换,因此 5/4/2010 永远不会是输入。如果是一位数字日期或月份,dd 和 mm 命名总是前面有 0。这是一个聪明的解决方案。
  • @agaggi 前提是您假设 100% 阅读此解决方案的人与 OP 的情况相同!
【解决方案4】:

这样做:

date('Y-m-d', strtotime('dd/mm/yyyy'));

但请确保 'dd/mm/yyyy' 是实际日期。

【讨论】:

  • 这是有问题的,因为 strtotime 会将带有/ 分隔符的日期读取为美国,即m/d/Y,而- 读取为欧洲d-m-Y。请参阅接受的答案的编辑和 php 文档:php.net/manual/en/function.strtotime.php - 注意:通过查看各个组件之间的分隔符来消除 m/d/y 或 dmy 格式的日期:如果分隔符是斜杠 (/),则假定美国 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 d-m-y 格式。
【解决方案5】:

我可以看到很好的答案,所以这里不需要重复,所以我想提供一些建议:

我建议使用 Unix Timestamp 整数而不是人类可读的日期格式在内部处理时间,然后使用 PHP 的 date() 函数将时间戳值转换为人类可读的日期格式以供用户显示。这是应该如何完成的粗略示例:

// Get unix timestamp in seconds
$current_time = date();

// Or if you need millisecond precision

// Get unix timestamp in milliseconds
$current_time = microtime(true);

然后在您的应用程序中根据需要使用$current_time(存储、加减等),然后当您需要向用户显示日期值时,您可以使用date() 指定所需的日期格式:

// Display a human-readable date format
echo date('d-m-Y', $current_time);

通过这种方式,您将避免在处理日期格式、转换和时区方面感到头疼,因为您的日期将采用紧凑、独立于时区(始终采用 UTC)并在编程中得到广泛支持的标准化格式(Unix 时间戳)语言和数据库。

【讨论】:

  • @VitorTyburski 你不能是认真的吗?任何头脑正常的专业程序员都知道,将日期存储为时间戳是处理日期格式以及添加或删除时间位的最佳方法,因为只需在时间戳值上添加或减去秒数。
  • 我通过了一些研究,明白了你的意思。你说得对。虽然你没有回答问题。
  • @VitorTyburski 你为什么要删除你的第一条评论?它只是表明你过于依赖“删除”功能来隐藏你的错误。我没有回答这个问题,因为当我在线程上时,最佳答案已经存在,所以我只想指出使用时间戳值是一种很好的做法。
  • 我错误地删除了第一条评论,但如果您希望我再次声明:“不要使用时间戳,因为它们会导致 DST 等问题......”。再次我的评论是错误的,我道歉。我只是不删除反对票,因为我不能并且,最重要的是,因为您应该发表评论。如果您编辑答案,我会很乐意删除反对票。对此感到抱歉。
  • 我还编辑了我的回复,以反映它只是一个注释,而不是对所提问题的回复。
猜你喜欢
  • 2013-03-18
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多