【问题标题】:PHP day of week numeric to day of week textPHP 星期几数字到星期几文本
【发布时间】:2011-01-20 00:37:48
【问题描述】:

这可能真的很容易,但我找不到 PHP 函数来执行此操作...

好吧

$dow_numeric = date('w');

给出星期天到星期六的数字星期 0-6。

$dow_text = date('D');

为文本中的星期几(Sun、Mon 等)给出 3 个字母的缩写

有没有使用$dow_numeric 获取$dow_text 的功能或简便方法?如果我有'0'作为$dow_numeric,我怎样才能使$dow_text = 'Sun'?是的,switch 声明可以完成这项工作,但我正在寻找更优雅的解决方案。

【问题讨论】:

    标签: php date


    【解决方案1】:

    有点小技巧,但是:

    $dow_text = date('D', strtotime("Sunday +{$dow_numeric} days"));
    

    【讨论】:

    • 这不是hacky,它是光滑的! ;-)
    • 或者,使用date('l')(小写L)作为全天名称。 more info
    • 太棒了!但是 {} 有什么用?
    • @GDY 在这个例子中:不,他们不是。可以说,它是为了可读性。但即便如此,这也是一个品味问题。在我们公司,我们会写:strtotime('Sunday +' . $dow_numeric . 'days')。即使是 PHP 经验较少的人也能理解这一点。
    【解决方案2】:

    它并不流行,但实际上在 PHP 中有一个函数 jddayofweek 用于此。您可以将第二个参数调用为 1 以获取完整的公历工作日名称,或使用 2 获取缩写名称。

    e.g. jddayofweek(2, 2); #returns Wed
    

    请注意,对于此函数,数字从星期一开始。所以星期一=0,星期二=1,...

    【讨论】:

    • 一周的默认开始时间是星期一。因此,如果您的星期日 == 0,则一切都会关闭一天。请记住这一点。
    • 这应该是最好的答案了。
    • 儒略日 0 = 公元前 4713 年 1 月 1 日(星期一)。这就是为什么 0 = 星期一; 1 = 星期二等。如果你想要 0 -> 星期日(等),那么你应该使用 jddayofweek($dow_numeric - 1, 2); (或 , 1 表示长日名称)
    • @klawipo,不-php.net/manual/en/function.jdtofrench.php(和其他人,请参阅php.net ....)-我相信答案中的“流行”意味着“不那么知名”-当然这是一个对我来说新功能(我已经使用 PHP 25 年了!)
    • 我建议使用提供的内置常量CAL_DOW_SHORTCAL_DOW_LONGjddayofweek。常量定义比它们的值更不可能改变。
    【解决方案3】:

    从一周中的数字0到6获取星期日到星期六

    //For example, our target numeric day is 0 (Sunday):
    $numericDay = 0; //assuming current date('w')==0 and date('D')=='Sun';
    

    Solution-1: 使用 PHP 的内置函数 jddayofweek()Monday 开始,而 date('w')Sunday 开始:

    jddayofweek($numericDay-1, 1); //returns 'Sun', here decreasing by '-1' is important(!)
    
    //jddayofweek(0, 1); //returns 'Mon';
    //jddayofweek(0, 2); //returns 'Monday';
    

    Solution-2:使用技巧(!):

    date('D', strtotime("Sunday +{$numericDay} days")); //returns 'Sun';
    
    //date('l', strtotime("Sunday +{$numericDay} days")); //returns 'Sunday';
    

    【讨论】:

    • strtotime 的好主意!
    • 好主意,是的……但是 6 年前有人提出了这个主意。所以这不是他的主意,更多的是复制粘贴。
    • 谢谢@Dwza,我尊重你的评论。但如果这样可以解决我们的目的并节省时间,我喜欢复制粘贴。 StackOverflow 也喜欢直接解决方案,而不是只提供任何外部链接。
    • 当然c&p是一种方式。但如果它在同一个问题中,则不是。如果你仔细看,得票最多的答案包含相同的解决方案。就在 6 年前。所以这不是一个外部链接:D(只谈论第二个解决方案)所以我明白你的意思,但这并不适合这种情况:) 不想以任何方式强迫你:D
    【解决方案4】:
    function getDay(){
        $dowMap = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
        $dow_numeric = date('w');
        return $dowMap[$dow_numeric];
    }
    

    【讨论】:

      【解决方案5】:

      创建一个数组以将数字 DOW 映射到文本 DOW。

      $dowMap = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
      

      如果您需要语言环境支持,请加载某个随机日期的 dow(例如,epoch (0) 是一个不错的日期),然后在接下来的 6 天内动态构建 dow 图。

      【讨论】:

      • 超级简单并且同意...所以我认为它还没有功能。
      • 重新发明轮子的巧妙技巧 :)
      【解决方案6】:

      如果您需要语言环境支持,您可以使用Hamishs answer 的一些改进功能:

      使用德国工作日的示例:

      setlocale(LC_TIME, 'de_DE');
      $dow_numeric = 3;
      $dow_text = strftime('%A', strtotime("Sunday +{$dow_numeric} days"));
      

      http://php.net/strftime

      如果 $dow_numeric 开始于 00 = 星期一),您可以将 Sunday 更改为 Monday 或 添加$dow_numeric += 1

      【讨论】:

      • 对于不喜欢文字翻译的人来说,epoch从星期四开始,一天有86400秒,所以strftime('%A', 86400 * ($dow_numeric + 3))也可以。
      【解决方案7】:

      这应该可行:

      $dow_numeric = 3;
      
      $last_sunday = strtotime('last Sunday');
      $dow_text = date('D', strtotime('+'.$dow_numeric.' day', $last_sunday));
      

      【讨论】:

        【解决方案8】:

        对于面向对象的方法,您可以使用 DateTime('Sunday')::add()DateInterval"PxD"

        当使用标准的星期几的数字表示 DateTime::format('w')0-6 用于周日至周六或 ISO-8601 一周中的一天的数字表示 DateTime::format('N')1-7 用于周一至周日。
        https://3v4l.org/3uthm

        $weekday = (new DateTime('Sunday'))
            ->add(new DateInterval('P' . $dow . 'D'));
        

        ISO-8601 表示按预期工作,因为它使用Sunday + 7 days (Sunday),导致Sunday + 1 day (Monday)Sunday + 6 days (Saturday)

        或者将星期日替换为星期一并使用$dowISO - 1
        https://3v4l.org/5uLOL

        $weekdayISO = (new DateTime('Monday'))
            ->add(new DateInterval('P' . ($dowISO - 1) . 'D'));
        

        DatePeriod 示例

        https://3v4l.org/uG9NT

        $sunday = new DateTimeImmutable('Sunday');
        $monday = new DateTimeImmutable('Monday');
        foreach (new DatePeriod($sunday, new DateInterval('P1D'), 6) as $date) {
            $dow = $date->format('w');
            $weekday = $sunday->add(new DateInterval('P' . $dow . 'D'));
        
            $dowISO = $date->format('N');
            $weekdayISOM = $monday->add(new DateInterval('P' . ($dowISO - 1) . 'D'));
            $weekdayISOS = $sunday->add(new DateInterval('P' . $dowISO . 'D'));
        
            printf("STD:  %s = %s\nISOM: %s = %s\nISOS: %s = %s\n\n", 
                $dow, $weekday->format('l'), 
                $dowISO, $weekdayISOM->format('l'), 
                $dowISO, $weekdayISOS->format('l')
            );
        }
        

        结果

        STD:  0 = Sunday
        ISOM: 7 = Sunday
        ISOS: 7 = Sunday
        
        STD:  1 = Monday
        ISOM: 1 = Monday
        ISOS: 1 = Monday
        
        STD:  2 = Tuesday
        ISOM: 2 = Tuesday
        ISOS: 2 = Tuesday
        
        STD:  3 = Wednesday
        ISOM: 3 = Wednesday
        ISOS: 3 = Wednesday
        
        STD:  4 = Thursday
        ISOM: 4 = Thursday
        ISOS: 4 = Thursday
        
        STD:  5 = Friday
        ISOM: 5 = Friday
        ISOS: 5 = Friday
        
        STD:  6 = Saturday
        ISOM: 6 = Saturday
        ISOS: 6 = Saturday
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-22
          • 1970-01-01
          • 2013-12-31
          • 1970-01-01
          • 1970-01-01
          • 2015-05-13
          • 2022-08-10
          • 1970-01-01
          相关资源
          最近更新 更多