php - 如何使 strtotime 解析澳大利亚(即英国)格式的日期 : dd/mm/yyyy?

标签 php datetime date locale strtotime

我不敢相信我以前从未遇到过这个。

基本上,我正在解析人工创建的文本文档中的文本,我需要解析的字段之一是日期和时间。因为我在澳大利亚,日期的格式类似于 dd/mm/yyyystrtotime 只想将其解析为美国格式的日期。此外,按 / 展开是行不通的,因为正如我提到的,这些文档是手写的,其中一些采用 d M yy 的形式。

我尝试了 setlocale 的多种组合,但无论我尝试什么,语言始终设置为美国英语。

我相当确定 setlocale 是这里的关键,但我似乎无法找到正确的代码。试过这些:

  • 我们
  • au-en
  • zh_CN
  • 澳大利亚
  • 澳大利亚

还有什么我可以尝试的吗?

为清楚起见:我在带有 Windows 框的 IIS 上运行。

非常感谢:)

伊恩

例子:

$mydatetime = strtotime("9/02/10 2.00PM");
echo date('j F Y H:i', $mydatetime);

生产

2 September 2010 14:00

我希望它产生:

9 February 2010 14:00

我的解决方案

我在这里对其中一个答案打勾,因为它对我来说是一个更容易阅读的解决方案,但这是我想出的:

$DateTime = "9/02/10 2.00PM";
$USDateTime = preg_replace('%([0-3]?[0-9]{1})\s*?[\./ ]\s*?((?:1[0-2])|0?[0-9])\s*?[./ ]\s*?(\d{4}|\d{2})%', '${2}/${1}/${3}', $DateTime);  
echo date('j F Y H:i',strtotime($USDateTime));

因为我不能依赖用户与他们的日期输入保持一致,所以我使我的正则表达式更复杂一些:

  • 0 或 1 个介于 0 和 3 之间的数字
  • 0 到 9 之间的一位数字——是的,这将匹配 37 作为有效日期,但我认为正则表达式已经足够大了!
  • 可以是一些空格
  • 分隔符(“.”、“/”或“”)
  • 可以是一些空格
  • 要么:
    • 10 到 12 之间的数字或
    • 1 到 9 之间的数字,前导 0 可选
  • 可以是一些空格
  • 分隔符(“.”、“/”或“”)
  • 可以是一些空格
  • 要么:
    • 2 位数字长或
    • 4 位数字

希望这能匹配大多数日期书写风格......

最佳答案

有一个快速修复程序似乎强制 PHP 的 strtotime 使用英国日期格式。 即:将传入字符串中的所有“/”替换为“-”。

例子:

date('Y-m-d', strtotime('01/04/2011'));

将产生:2011-01-04

date('Y-m-d', strtotime('01-04-2011'));

将产生:2011-04-01

您可以使用 str_replace 来实现这一点。

例子:

str_replace('/', '-', '01/04/2011');

编辑:

如评论中所述,这是有效的,因为 PHP 将斜杠解释为美国的,将点/破折号解释为欧洲的。

我已经广泛使用了这个技巧,到目前为止没有遇到任何问题。

如果有人有充分的理由不使用它,请发表评论。

关于php - 如何使 strtotime 解析澳大利亚(即英国)格式的日期 : dd/mm/yyyy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444820/

相关文章:

Php 魔术方法和空

将目录树生成为嵌套 html 列表时的 PHP 函数错误

javascript - 比较简单的日期字符串(例如 console.log ("24.3.2018"< "20.3.2017"))

mysql - Sql 前一天拉取(周一除外)周五至周日拉取

php - 如何在 GROUP_CONCAT 内使用 CONCAT 限制/偏移查询以在 codeigniter 中创建分页

php - Laravel 重定向路由无法使用 return 但如果我使用 echo 它的工作为什么?

c# - System.DateTime 种类位

ruby-on-rails - 在忽略 ruby​​ 中的日期组件时比较时间是否过去

python - PySpark:在日期为字符串的范围内按日期字段过滤 DataFrame

java - 如何将 LocalDateTime 转换为忽略日期时区?