Datetime Symfony/策略:根据时区格式化日期时间?
在Symfony应用程序中Datetime Symfony/策略:根据时区格式化日期时间?,datetime,symfony1,internationalization,timezone,Datetime,Symfony1,Internationalization,Timezone,在Symfony应用程序中 存储用户时区信息的最佳方式是什么 它是通过文化发现的吗 应该存储哪些标准密钥?使用PHP时区并存储为文本 如何在表示层上格式化服务器日期时间 是否有PHP/Symfony帮助程序可以做到这一点 关于你的第一个问题。 我认为没有为用户存储时区,但当然可以。 但是您应该检查settings.yml中settings下的default\u时区设置 对于格式化日期,可以使用日期帮助程序。它依次使用sfDateFormat类,该类使用当前用户区域性初始化。 您还可以使用
- 它是通过文化发现的吗
- 应该存储哪些标准密钥?使用PHP时区并存储为文本
- 是否有PHP/Symfony帮助程序可以做到这一点
settings.yml
中settings
下的default\u时区设置
对于格式化日期,可以使用日期
帮助程序。它依次使用sfDateFormat
类,该类使用当前用户区域性初始化。
您还可以使用它来显示给定日期的时区。关于您的第一个问题。
我认为没有为用户存储时区,但当然可以。
但是您应该检查settings.yml
中settings
下的default\u时区设置
对于格式化日期,可以使用日期
帮助程序。它依次使用sfDateFormat
类,该类使用当前用户区域性初始化。
您还可以使用它来显示给定日期的时区。我使用以下策略:
- 服务器日期时间为UTC
- 所有日期都在UTC中管理和存储
- 用户配置文件表有一个文本类型的时区字段,其中存储了他的PHP时区
- 用户可以在他们的配置文件页面中设置/更改他们的时区(选择widget is
sfWidgetFormI18nChoiceTimezone
)
- 为了显示任何日期,我使用了一个小型助手
utcToLocal\u date
,它使用date
助手的format\u date
功能:
我使用以下策略:
- 服务器日期时间为UTC
- 所有日期都在UTC中管理和存储
- 用户配置文件表有一个文本类型的时区字段,其中存储了他的PHP时区
- 用户可以在他们的配置文件页面中设置/更改他们的时区(选择widget is
sfWidgetFormI18nChoiceTimezone
)
- 为了显示任何日期,我使用了一个小型助手
utcToLocal\u date
,它使用date
助手的format\u date
功能:
谢谢你,格拉德。但是,如果我希望存储时区,首选的数据类型是什么,我应该使用什么作为主数据?任何以时区作为输入的sfDateFormat的代码段?首选数据类型取决于您希望如何向用户显示它。当然,偏移量足以计算,但如果您想将其呈现给用户,字符串会更好。我认为没有一种方法可以为时区提供sfDateFormat构造函数。我认为您必须创建自己的助手(/class)来实现这一点,它只需将UTC时间“转换”为用户时区中的时间(然后将其传递给DateHelper函数?)。至少,我会这么做的。谢谢你,格拉德。但是,如果我希望存储时区,首选的数据类型是什么,我应该使用什么作为主数据?任何以时区作为输入的sfDateFormat的代码段?首选数据类型取决于您希望如何向用户显示它。当然,偏移量足以计算,但如果您想将其呈现给用户,字符串会更好。我认为没有一种方法可以为时区提供sfDateFormat构造函数。我认为您必须创建自己的助手(/class)来实现这一点,它只需将UTC时间“转换”为用户时区中的时间(然后将其传递给DateHelper函数?)。至少,我会这样做。
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;
}