如何以澳大利亚(即英国)格式制作strtotime解析日期:dd/mm/yyyy?

Iai*_*ser 11 php datetime locale date strtotime

我无法相信我以前从未遇到过这个.

基本上,我正在解析人工创建的文本文档中的文本,我需要解析的一个字段是日期和时间.因为我在澳大利亚,日期格式化,dd/mm/yyyystrtotime只想将其解析为美国格式的日期.此外,爆炸式的/方法并不奏效,因为正如我所提到的,这些文件是手工打印的,其中一些是采用的形式d M yy.

我尝试了多种组合,setlocale但无论我尝试什么,语言总是设置为美国英语.

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

  • AU
  • AU-EN
  • EN_AU
  • 澳大利亚
  • AUS

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

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

非常感谢 :)

伊恩

例:

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

产生

2 September 2010 14:00
Run Code Online (Sandbox Code Playgroud)

我想要它产生:

9 February 2010 14:00
Run Code Online (Sandbox Code Playgroud)

我的解决方案

我在这里给出了一个答案,因为它是一个比我更容易理解的解决方案,但这就是我想出来的:

$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));
Run Code Online (Sandbox Code Playgroud)

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

  • 0到1之间的0或1位数
  • 0到9之间的1位数 - 是的,这将匹配37作为有效日期,但我认为正则表达式已经够大了!
  • 可能是一些空白
  • 分隔字符('.','/'或'')
  • 可能是一些空白
  • 或者:
    • 10到12之间的数字OR
    • 1到9之间的数字,可选前导0
  • 可能是一些空白
  • 分隔字符('.','/'或'')
  • 可能是一些空白
  • 或者:
    • 长度为2位数的OR
    • 长4位数

希望这将符合大多数日期写作风格......

Chr*_*son 19

有一个快速修复,似乎迫使PHP strtotime使用英国日期格式.即:用' - '替换传入字符串中的所有'/'.

例:

date('Y-m-d', strtotime('01/04/2011'));
Run Code Online (Sandbox Code Playgroud)

会产生:2011-01-04

date('Y-m-d', strtotime('01-04-2011'));
Run Code Online (Sandbox Code Playgroud)

会产生:2011-04-01

你可以用它str_replace来实现这一目标.

例:

str_replace('/', '-', '01/04/2011');
Run Code Online (Sandbox Code Playgroud)

编辑:

正如评论中所述,这是有效的,因为PHP将斜杠解释为美式,将点/短划线解释为欧式.

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

如果有人有任何理由不使用此,请发表评论.

  • http://solidgone.org/PHP-strtotime-assumptions-with-European-and-American-date-formats描述了这背后的"推理".连字符表示ISO日期格式,点表示欧洲,斜线表示美国.下一个问题:但为什么会这样? (2认同)