【问题标题】:Retrieving Day Names in PHP在 PHP 中检索日期名称
【发布时间】:2011-10-14 09:13:16
【问题描述】:

我需要在表单中向用户显示本地化日期名称列表(如“星期一”、“星期二”...)。我知道如何获取任何日期的日期名称。但是是否有一种特殊且防失败的方法来获取数组中的所有日期名称。

编辑:我可以在翻译文件中添加日期名称,但这很难维护。

【问题讨论】:

  • 日期名称?你的意思是像Monday, Tuesday, Wednesday... etc?
  • 为什么不自己定义呢?这通常是最好的方法,因为询问 date() 取决于众所周知的不可靠的区域设置。
  • 任何本地化解决方案都需要在您的整体本地化战略中加以考虑。 Vascowhite 的解决方案不一定是特定于语言环境的,但它可以作为许多不同本地化解决方案的基础。请参阅我的评论,并注意他的调整。如果您使用数字索引作为日期,这将允许您获得一个可预测的字符串,然后您可以将其用作返回本地化字符串的键。

标签: php date locale


【解决方案1】:

可以选择将strftime()setlocale() 结合使用。

但是您应该知道,在线程化的 php 安装中,setlocale() 的行为可能会出乎意料,因为语言环境信息是按进程维护的,而不是按线程维护的。因此,在每次调用 strftime() 之前,每次调用 setlocale() 以确保它使用正确的语言环境非常重要。

另外,对于 Windows 系统,您需要为 $locale 参数使用一些不寻常的字符串来表示 setlocale()

有关这两个问题的更多信息,请参阅文档。

这样的事情应该可以工作:

// define the locales for setlocale() for which we need the daynames
$locales = array(
  'en_EN',
  'de_DE',
  'nl_NL'
  // etc...
);

// be aware that setlocale() needs different values on Windows machines
// see the docs on setlocale() for more information
$locales = array(
  'english',
  'german',
  'dutch'
  // etc...
);

// let's remember the current local setting
$oldLocale = setlocale( LC_TIME, '0' );

// initialize out result array
$localizedWeekdays = array();

// loop each locale
foreach( $locales as $locale )
{
    // create sub result array for this locale 
    $localizedWeekdays[ $locale ] = array();

    // 7 days in a week
    for( $i = 0; $i < 7; $i++ )
    {
        // set the locale on each iteration again
        setlocale( LC_TIME, $locale );

        // combine strftime() with the nifty strtotime()
        $localizedWeekdays[ $locale ][] = strftime( '%A', strtotime( 'next Monday +' . $i . ' days' ) );

        // reset the locale for other threads, as a courtesy
        setlocale( LC_TIME, $oldLocale );
    }
}

// there is your result in a multi-dimensional array
var_dump( $localizedWeekdays );

【讨论】:

  • 请注意,本地化的工作日以windows-1250 而不是utf-8 返回。额外的编码转换,例如可能需要通过iconv。在 Win64 PHP 7.0 上测试。
【解决方案2】:

“通常”的方式是从给定的last day 开始,并在每次迭代中计算一天。

for ($i = 0; $i < 7; $i++) {
  $weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}

【讨论】:

    【解决方案3】:
    $dayNames = array(
        'Sunday',
        'Monday', 
        'Tuesday', 
        'Wednesday', 
        'Thursday', 
        'Friday', 
        'Saturday', 
     );
    

    非常防故障:)

    更严肃的一点是,PHPBB 之类的工具通过为不同语言定义本地化文件和硬编码来做到这一点。这确实是可靠地做到这一点的唯一方法。

    我建议下载类似的东西并查看代码以了解它是如何完成的。

    http://www.phpbb.com/downloads/olympus.php

    【讨论】:

    • 所有语言都很难维护,这让我变成了一只悲伤的熊猫。
    • 如果你要这样做,它应该是 'Sunday', ... 'Saturday' 与从 date('w') 返回的日期一致,其中 Sunday 是第 0 个元素。跨度>
    【解决方案4】:
    $date = '2011/10/14'; 
    $day = date('l', strtotime($date));
    echo $day;
    

    【讨论】:

    • 下班后突然不行了,我停止了apache!现在是返回数字而不是日期名称...
    • 感谢您拯救我的一天。
    【解决方案5】:

    这段代码可以很好地工作:-

    $dayNames = array(
        0=>'Sunday',
        1=>'Monday', 
        2=>'Tuesday', 
        3=>'Wednesday', 
        4=>'Thursday', 
        5=>'Friday', 
        6=>'Saturday', 
     );
    

    现在,例如,您想从数组中获取任何一天:-

    echo $dayNames[1]; //Output:- Monday
    

    【讨论】:

      【解决方案6】:
      setlocale(LC_TIME, 'de_DE');
      
      $today = ( 86400 * (date("N")) );
      
      for( $i = 0; $i < 7; $i++ ) {
          $days[] = strftime('%A', time() - $today + ($i*86400));
      }
      
      print_r($days);
      

      显然可以通过不调用 time() 7 次等来进行优化,但这就是要点。它为您提供适合区域设置的语言,并保持数组的 Sun-Sat 顺序。

      【讨论】:

        【解决方案7】:

        我知道已经很久了,但是呢:

        $timestamp = strtotime('next Sunday');
        $days = array();
        for ($i = 0; $i < 7; $i++) {
         $days[] = strftime('%A', $timestamp);
         $timestamp = strtotime('+1 day', $timestamp);
        }
        

        来自how to create array of a week days name in php

        【讨论】:

        • 我看不出这个解决方案和批准的解决方案有什么区别。
        猜你喜欢
        • 2020-05-18
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        相关资源
        最近更新 更多