PHP DateTime构造函数 - 基于DateTimeZone的日期字符串格式

问题描述:

我有一个使用两种不同类型日期格式的多国系统。一个使用“d-m-Y”,另一个使用“m-d-Y”。我有一个Local类,它负责根据传入的日期字符串创建一个DateTime对象。PHP DateTime构造函数 - 基于DateTimeZone的日期字符串格式

传入的字符串是动态的,可以是任一版本。问题是,即使你在DateTime构造函数中指定了DateTimeZone,你仍然需要传入一个基于'm-d-y'的字符串。

我需要能够将一个字符串传递给DateTime构造函数,该构造函数基于与它一起传入的DateTimeZone。例如,如果我的时区设置为澳大利亚/悉尼 ,则DateTime构造函数应接受字符串“31/11/2017”,但它不会。 DateTime构造函数不考虑传入字符串的TimeZone。我将不得不使用DateTime :: createFromFormat,但这意味着我将不得不手动指定数百个时区的格式。这将是容易得多,如果DateTime构造将采取基于传递在这样的时间段的字符串格式...

$dateTime = new DateTime('31/11/2017', new DateTimeZone('Australia/Sydney'))

这应该工作,但我的情况并非如此。有谁知道我做错了什么?必须有一种方法来实现这一点。

+1

改为使用时间戳格式 – OPV

也许您的日期格式不被PHP的DateTime构造函数接受。一种解决办法是尝试这个办法:

$dateTime = DateTime::createFromFormat('d/m/Y', '31/11/2017') 
    ->setTimeZone('Australia/Sydney'); 

$dateTime = DateTime::createFromFormat('d/m/Y', '31/11/2017', 'Australia/Sydney'); 
+0

当我尝试这个时,我的$ dateTime变量设置为false。 我也试过这个,但它回来也是假的以及... DateTime :: createFromFormat('31/11/2017','DD/MM/YYYY'); –

+0

什么是您的PHP版本? –

+0

我们正在使用PHP 5.6 –

可以使用PHP-国际扩展,让每区域串

foreach (["en_US", "en_IE", "de_DE"] as $fmt) { 
    $formatter = datefmt_create($fmt, IntlDateFormatter::SHORT, IntlDateFormatter::NONE); 
    echo datefmt_get_pattern($formatter) . "\n"; 
} 

默认字符串看到datefmt_get_pattern文档更多细节。

+0

由'datefmt_get_pattern()'返回的“完整”模式仍然需要转换为PHP的格式代码(例如'yyyy'到' Y'),但一个很好的方法 –