我不敢相信我以前从未遇到过这个。
基本上,我正在解析人工创建的文本文档中的文本,我需要解析的字段之一是日期和时间。因为我在澳大利亚,日期的格式类似于 dd/mm/yyyy
但 strtotime
只想将其解析为美国格式的日期。此外,按 /
展开是行不通的,因为正如我提到的,这些文档是手写的,其中一些采用 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/