Php Zend_日期/Zend_语言环境:是否更改特定语言环境的日期格式?

Php Zend_日期/Zend_语言环境:是否更改特定语言环境的日期格式?,php,zend-framework,zend-date,zend-locale,Php,Zend Framework,Zend Date,Zend Locale,是否可以指示Zend_语言环境,它应该使用特定的语言环境,除了对日期格式进行轻微更改?我不想将Zend_Date::toString()与特定格式一起使用,因为在所有地区都会使用这种格式 问题案例:我根据用户的区域设置设置了日期格式。我的荷兰同行(nl_nl)用户要求的是dd-mm-yyyy格式的日期,而不是Zend_Locale极力声称是我们的短日期格式的dd-mm-yy。如果我将输出日期的代码更改为显式使用自定义格式,这将适用于所有客户,而不仅仅是奶酪头。我可以检查用户的区域设置,但如果需要

是否可以指示Zend_语言环境,它应该使用特定的语言环境,除了对日期格式进行轻微更改?我不想将Zend_Date::toString()与特定格式一起使用,因为在所有地区都会使用这种格式

问题案例:我根据用户的区域设置设置了日期格式。我的荷兰同行(nl_nl)用户要求的是dd-mm-yyyy格式的日期,而不是Zend_Locale极力声称是我们的短日期格式的dd-mm-yy。如果我将输出日期的代码更改为显式使用自定义格式,这将适用于所有客户,而不仅仅是奶酪头。我可以检查用户的区域设置,但如果需要创建更多的异常,每次回显日期时,我都需要添加这些检查和异常,这让我感到害怕

我不能直接改变Zend_语言环境XML数据(我也不想),因为ZF库被各种站点使用


我相信这是一个“非常简单”的问题。。。一旦你知道怎么做。有什么想法吗?

一定有办法:

  • 扩展Zend_语言环境
  • 创建与要自定义其行为的现有区域设置相对应的新区域设置
  • 为包含自定义项的新区域设置创建新的XML文件
  • 然后,在引导中创建新的区域设置对象。如果当前区域设置与要自定义的区域设置匹配,则手动切换到新区域设置

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

    不管怎样,只是说说一些想法。希望它能给你一些方向,或者启发其他比我更有知识的人——这的确是一个相当低的标准提出更明确、更权威的东西


    干杯

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

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

    因此,也许您可以在配置文件中存储一个格式覆盖列表。在引导过程中,检查加载的区域设置是否需要覆盖,然后将格式存储在视图中。然后,无论何时输出日期,都使用该格式

    大概是这样的:

    应用程序/configs/application.ini
    中:

    dateFormat.nl_NL = "d-m-Y"
    
    应用程序/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;
    }
    
    最后,在视图脚本中,
    $date
    是一个
    Zend_date
    对象:

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


    如果
    $view->dateFormat
    为空,则将使用当前区域设置的格式。否则,你的重写将被应用。

    < P>我也开始考虑David Weinraub的第二个解决方案。< /P> 以下是我对任何地区转换为4位数年份的偏好:

    Bootstrap
    类中(
    application/Bootstrap.php
    文件)

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


    谢谢你的想法,大卫!我也一直在沿着这些思路思考,很高兴看到它以一步一步的方式被写出来。不过,这让我觉得可能有一种更简单的方法可以做到这一点。我还想知道如何更改给定区域设置的日期格式,但在Zend Framework 1中找不到任何方法。本以为我可以创建一个自定义LDML文件并将其传递给Zend_Locale_Data:但这似乎是不可能的(有用的成员和方法是私有的)。@kander:请看我的另一个不同方法的答案。嗨,David-虽然我不再从事这个项目,但这个问题是其中的一部分,我很高兴看到一个解决方案浮出水面。谢谢很抱歉迟迟没有接受答案:)我很高兴,很高兴能帮上忙。干杯
    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 **/
    }
    
    $date = new Zend_Date();
    echo $date->toString(DATE_SHORT_LONGYEAR);