将PHP中的星期几数字转换为星期几文本

59

这可能很简单,但我找不到一个能够做到这点的 PHP 函数...

好的,那么

$dow_numeric = date('w');

返回数字形式的星期几,0-6代表周日到周六。

还有

$dow_text = date('D');

返回文本星期几的三个字母缩写(Sun,Mon等)。

是否有函数或简单的方法可以使用 $dow_numeric 获取 $dow_text?如果 $dow_numeric 是 '0',那么如何使 $dow_text = 'Sun'?是的,switch 语句可以完成工作,但我正在寻找更优雅的解决方案。

8个回答

142

有点取巧,但是:

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

18
不是投机取巧,而是优雅得体!;-) - acme
13
另外,您可以使用 date('l')(小写 L)获取完整的星期几名称。更多信息 - ᴍᴇʜᴏᴠ
太好了!但是{}是用来干什么的? - GDY
@GDY 这被称为复杂(花括号)语法 - aProgger
@aProgger 谢谢,我不知道这个叫什么。但在这个例子中,括号不是必需的吗? - GDY
2
在这个例子中:不,它们不是。有人可能会说,这是为了可读性。但即使如此,这也是一个品味问题。在我们公司,我们会写成:strtotime('Sunday +' . $dow_numeric . ' days')。即使是那些经验较少的PHP开发者也能理解这个代码。 - aProgger

75

虽然不是很有名,但实际上PHP中有一个功能jddayofweek。 您可以将第二个参数设置为1来获取完整的公历星期几名称,或将其设置为2以获取缩写名称。

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

请注意,对于此函数,数字从周一开始计数。因此,周一为0,周二为1,...


2
一周的默认起始日是星期一。因此,如果你的星期天 == 0,那么所有的日期都会偏移一天。请记住这一点。 - PBwebD
23
这应该是最佳答案。 - Caleb Lewis
2
儒略日0 = 公元前4713年1月1日(星期一)。这就是为什么0 = 星期一;1 = 星期二等。如果你想让0代表星期天(等等),那么你应该使用jddayofweek($dow_numeric - 1, 2);(或者,对于长日期名称,使用1)。 - xtempore
1
@klawipo,不是这个 - http://php.net/manual/en/function.jdtofrench.php(还有其他的,请参见php.net....)- 我认为答案中的“popular”意味着“不太知名”- 对我来说,它肯定是一个新函数(而我已经使用PHP超过25年了!) - Apps-n-Add-Ons
2
我建议使用jddayofweek提供的内置常量CAL_DOW_SHORTCAL_DOW_LONG。常量定义比它们的值更不容易改变。 - R. Chappell
显示剩余4条评论

36
创建一个数组来将数字格式的星期几(DOW)映射为文本格式的星期几。
$dowMap = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');

如果您需要本地化支持,请加载某个随机日期的dow(例如纪元(0)将是一个很好的日期),然后接下来的6天动态构建dow映射。


1
非常简单和易懂...所以我认为还没有现成的函数。 - csi
1
聪明的技巧,重新发明轮子 :) - Peter Chaula

9

将数字星期几0到6转换为星期日至星期六

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

解决方案-1:使用PHP内置函数jddayofweek(),它从星期一开始,而date('w')星期日开始:

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

//jddayofweek(0, 1); //returns 'Mon';
//jddayofweek(0, 2); //returns 'Monday';

解决方案-2: 使用一个技巧(!):

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

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

2
strtotime 是个好主意! - Petr Cibulka
好主意,没错...但是有人在6年前就想到了这个主意。所以这不是他的主意,更像是复制粘贴。 - Dwza
谢谢@Dwza,我尊重你的评论。但是如果复制粘贴可以解决我们的问题并节省时间,我会喜欢这种方法。此外,StackOverflow更喜欢直接提供解决方案,而不仅仅是提供任何外部链接。 - Reza Mamun
当然,复制和粘贴是一种方法。但如果它在同一个问题中就不行了。如果你仔细看的话,得票最多的答案包含了相同的解决方案。只是早了6年而已。所以这不是一个外部链接:D(只谈第二个解决方案)。我理解你的观点,但这并不适用于这种情况:)我没有想强迫你做任何事情:D - Dwza

5
function getDay(){
    $dowMap = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
    $dow_numeric = date('w');
    return $dowMap[$dow_numeric];
}

2
如果您需要本地化支持,可以使用 Hamishs answer 的一种稍微改进的函数:
以下是使用德语工作日的示例:
setlocale(LC_TIME, 'de_DE');
$dow_numeric = 3;
$dow_text = strftime('%A', strtotime("Sunday +{$dow_numeric} days"));

http://php.net/strftime

如果 $dow_numeric0(即星期一)开始,你可以将 Sunday 改为 Monday,或者添加 $dow_numeric += 1

对于那些不喜欢文本翻译的人来说,纪元从星期四开始,一天有86400秒,因此strftime('%A',86400 *($ dow_numeric + 3))也可以使用。 - wordragon

1

这应该可以工作:

$dow_numeric = 3;

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

0

如果采用面向对象的方法,您可以使用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表示法按预期工作,因为它使用星期日+7天(星期日),结果是星期日+1天(星期一)星期日+6天(星期六)

或者将星期日替换为星期一,并使用$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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接