如何根据当前区域设置正确格式化/转换日期时间?

时间:2013-12-06 13:35:47

标签: php datetime yii

我有这段代码:

$dateTime = new DateTime('@'.strtotime('+30 minutes'));
$dateTime->setTimezone(new DateTimeZone($someModel->timezone));
$otherModel->send_at = $dateTime->format($otherModel->getDateTimeFormat());

$otherModel->getDateTimeFormat()返回M/d/yy h:mm a这是好的,因为它基于当前基于CLDR的Yii语言环境,据我所知。

现在,当我将此格式传递给PHP的DateTime::format()类方法[$dateTime->format($otherModel->getDateTimeFormat())]时,我得到了这样的结果:Dec/06/1313 03:1212 pm这看起来很奇怪,因为php接受date / datetime的格式与Yii在其语言环境中使用的不同。

如何解决此类问题?

这是修复:

$dateTime = new DateTime('@'.strtotime('+30 minutes'));
$dateTime->setTimezone(new DateTimeZone($someModel->timezone));

// get a timestamp from the current date that also knows about the offset.
$timestamp = CDateTimeParser::parse($dateTime->format('Y-m-d H:i:s'), 'yyyy-MM-dd HH:mm:ss');

// now format using Yii's methods and format type
$otherModel->send_at = Yii::app()->dateFormatter->formatDateTime($timestamp, 'short', 'short');

这个想法是使用PHP的DateTime::format()方法来提取考虑了用户时区的时间戳。然后,根据此时间戳,根据Yii日期时间格式进行格式化。

1 个答案:

答案 0 :(得分:1)

嗯,没什么奇怪的,您的日期格式为M/d/yy h:mm a,并且根据DateTime::format() documentation

  • M:一个月的简短文字表示,三个字母
  • y:一年的两位数表示
  • ...等

Yii不使用相同的格式: http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns

您应该只使用CDateFormatter::format()http://www.yiiframework.com/doc/api/1.1/CDateFormatter#format-detail