我有这段代码:
$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日期时间格式进行格式化。
答案 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