PHP DateTime构造函数 - 基于DateTimeZone

时间:2017-10-20 20:35:38

标签: php datetime

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

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

我需要能够根据与其一起传入的DateTimeZone将字符串传递给DateTime构造函数。例如,如果我的TimeZone设置为澳大利亚/悉尼 DateTime构造函数应该接受像'31 / 11/2017'那样的字符串,但事实并非如此。 DateTime构造函数不考虑使用字符串传入的TimeZone。我必须使用DateTime :: createFromFormat,但这意味着我必须手动指定数百个时区的格式。如果DateTime构造函数根据传入的时区采用字符串格式会更容易...

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

这应该有效,但在我的情况下不行。有谁知道我做错了什么?必须有办法实现这一目标。

2 个答案:

答案 0 :(得分:2)

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');

答案 1 :(得分:1)

你可以使用php-intl-extension来获取每个locale-string的默认字符串

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上的文档。

相关问题