我不敢相信我以前从未遇到过这个。
基本上,我正在解析人工创建的文本文档中的文本,而我需要解析的字段之一是日期和时间。因为我在澳大利亚,日期的格式类似于dd/mm/yyyy
但strtotime
只想将其解析为美国格式的日期。此外,exploding by/
是行不通的,因为正如我所提到的,这些文档是手工输入的,其中一些采用d M yy
.
我尝试了多种组合,setlocale
但无论我尝试什么,语言总是设置为美国英语。
我相当确定 setlocale 是这里的关键,但我似乎无法找到正确的代码。试过这些:
- 澳大利亚
- 奥恩
- en_AU
- 澳大利亚
- 澳大利亚
还有什么我可以尝试的吗?
为清楚起见:我在带有 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 到 3 之间的 0 或 1 个数字
- 0 到 9 之间的 1 位数字——是的,这将匹配 37 作为有效日期,但我认为正则表达式已经足够大了!
- 可能是一些空格
- 分隔符('.'、'/' 或 '')
- 可能是一些空格
- 任何一个:
- 10 到 12 之间的数字或
- 1 到 9 之间的数字,前导 0 可选
- 可能是一些空格
- 分隔符('.'、'/' 或 '')
- 可能是一些空格
- 任何一个:
- 一个 2 位数长的数字或
- 一个 4 位数长的数字
希望这将匹配大多数日期写作风格......