Zend_Date / Zend_Locale:更改特定区域设置的日期格式?

时间:2010-12-28 20:08:56

标签: php zend-framework zend-date zend-locale

是否可以指示Zend_Locale应该使用某个区域设置,除了对日期格式进行微小更改?我不想将Zend_Date :: toString()与特定格式一起使用,因为这会在所有语言环境中使用这种格式。

有问题的案例:我根据用户的区域设置格式化了日期。我的荷兰(nl_NL)用户要求使用dd-mm-yyyy格式的日期,而不是dd-mm-yy,Zend_Locale强烈声称这是我们的短日期格式。如果我更改输出日期的代码以明确使用自定义格式,则适用于所有客户而不仅仅是奶酪头。我可以检查用户的语言环境,但是如果需要创建更多的异常,每次回显日期时我都需要添加这些检查和异常,这样做的前景让我感到畏缩。

我无法直接(并且不希望)更改Zend_Locale XML数据,因为各个站点都使用ZF库。

我确信这是“非常简单”的问题之一......一旦你知道如何。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

必须有一些方法:

  1. 延长Zend_Locale
  2. 创建与您要自定义其行为的现有区域设置相对应的新区域设置。
  3. 为包含自定义项的新语言环境创建新的XML文件。
  4. 然后,在Bootstrap中,创建新的语言环境对象。如果当前区域设置与您要自定义的区域设置匹配,则手动切换到新区域设置。

    关键可能是放置新XML文件的位置以及如何定义映射。当然,您可能不希望在Zend文件夹中放置任何新内容,那么我们如何告诉Zend_Locale和他的朋友使用新位置?该映射信息是否在各种Zend_Locale_XXX类中“硬编码”?

    无论如何,只是说出一些想法。希望它给你一些方向或激励别人比我更有知识 - 确实是一个相当低的酒吧! - 提出更具权威性和权威性的内容。

    干杯!

答案 1 :(得分:1)

[尝试新的答案,因为这种方法与之前的答案有实质性的不同。]

我假设您将在视图中调用Zend_Date::toString()

因此,也许您可​​以在配置文件中存储格式覆盖列表。在Bootstrap期间,检查加载的语言环境是否需要覆盖,然后将格式存储在视图中。然后,每当您输出日期时,请使用该格式。

这样的事情:

application/configs/application.ini

dateFormat.nl_NL = "d-m-Y"

application/Bootstrap.php

protected function _initDateFormat()
{
    // Bootstrap and grab the view
    $this->bootstrap('view');
    $view = $this->getResource('view');

    // grab the date format overrides from options or null for locale-default
    $options = $this->getOptions();
    $this->bootstrap('locale');
    $locale = $this->getResource('locale');
    $dateFormat = isset($options['dateFormat'][$locale]) 
        ? $options['dateFormat'][$locale] 
        : null;

    // stash the dateFormat into the view
    $view->dateFormat = $dateFormat;
}

最后在视图脚本中,$dateZend_Date对象:

<p>The date is <?= $date->toString($this->dateFormat) ?>.</p>

如果$view->dateFormat为null,则将使用当前语言环境的格式。否则,您的覆盖将适用。

答案 2 :(得分:0)

我也开始考虑David Weinraub的第二个解决方案。

以下是我对任何区域设置切换到4位数年份的风格:

Bootstrap类(application/Bootstrap.php文件)

protected function _initDate() {
    /** Test and correct Zend_Date::DATE_SHORT format **/
    $localeDataDateFormats = Zend_Locale_Data::getList(Zend_Locale::findLocale(), 'date'); // Date formats for auto Locale (@see Zend_Locale::findLocale())
    define(
        'DATE_SHORT_LONGYEAR',  // Define our new format, should now use it instead of Zend_Date::DATE_SHORT
        preg_replace('@((' . Zend_Date::YEAR . ')+|(' . Zend_Date::YEAR_8601 . ')+)@', '$2$3', $localeDataDateFormats['short']) // Makes years displayed with every digits available
    );
    /** /Test and correct Zend_Date::DATE_SHORT format **/
}

使用它(使用新常量而不是Zend_Date::DATE_SHORT):

$date = new Zend_Date();
echo $date->toString(DATE_SHORT_LONGYEAR);