Symfony /策略:基于时区格式化日期时间?
问题描述:
在Symfony的应用...Symfony /策略:基于时区格式化日期时间?
-
什么是存储用户的时区信息的最佳方式?
- 它是通过文化发现的吗?
- 应存储哪些标准密钥?使用PHP时区和商店作为文本?
-
如何格式化表示层上的服务器日期时间?
- 是否有PHP/Symfony帮手来做到这一点?
答
关于你的第一个问题。 我不认为用户的时区是存储的,但当然可以。 但是,您应该检查settings.yml
中的.settings
下的default_timezone
设置。
对于格式化日期,您可以使用Date
帮助程序。后者依次使用sfDateFormat
类,该类使用当前用户文化进行初始化。 您也可以使用它来显示给定日期的时区。
答
我用下面的策略:
- 服务器的日期时间为UTC
- 所有日期的管理和存储在UTC
- 用户资料表具有用于保存他的PHP时区类型文本区字段
- 用户可以设置/改变他们的时区在他们的个人资料页(选择widget是
sfWidgetFormI18nChoiceTimezone
) - 显示任何日期,我用一个小帮手
utcToLocal_date
其中使用功能的Date
帮手:
。
function utcToLocal_date($originedatetime, $format = 'g')
{
if (class_exists('sfContext', false) && sfContext::hasInstance() && sfConfig::get('sf_i18n'))
{
$timezone = sfContext::getInstance()->getUser()->getProfile()->getTimezone();
if (!empty($timezone) && ($newtimezone = new DateTimeZone($timezone)))
{
$datetime = new DateTime($originedatetime);
$datetime->setTimezone($newtimezone);
$originedatetime = $datetime->format("Y-m-d H:i:s");
}
}
if (function_exists('format_date'))
{
return format_date($originedatetime, $format);
}
return $originedatetime;
}
谢谢Grad。但是,如果我想存储时区,首选的数据类型是什么,我应该使用什么作为主数据? sfDateFormat需要时区作为输入的任何代码片段? – Prasad 2011-04-14 03:42:01
首选数据类型取决于你想如何显示给你的用户。当然,偏移量足以进行计算,但如果要将其呈现给用户,字符串会更好。 我认为没有办法用sfDateFormat构造函数提供时区。我认为你将不得不创建自己的Helper(/ class)来实现这一点,除了将UTC时间翻译成用户时区中的某个时间(然后将它传递给DateHelper函数?至少,我就是这么做的。 – 2011-04-14 08:35:55