如何将周数和年份转换为Unix时间戳?

33

我想将日期分组为一周的编号和年份,然后将该周编号转换回Unix时间戳。我该如何实现?


请说明您所说的“将周数转换为时间戳”的含义。 - Pekka
3个回答

95

我假设您正在使用ISO 8601周数,并希望ISO 8601周的第一天,以便例如2011年第1周返回2011年1月3日

strtotime可以使用{YYYY}W{WW}格式轻松实现此功能:

echo date("Y-m-d", strtotime("2011W01")); // 2011-01-03

请注意,周数需要是两位数

可悲的是,用于处理日期的新型PHP 5函数DateTime::createFromFormat似乎无法解析这种信息——它没有“周”占位符。


尽管有关DateTime :: createFromFormat()的注释今天仍然是正确的,但我想补充说,您仍然可以使用DateTime:new DateTime('2011W01')确实有效。 - Dennis98
虽然这个方法可以用,但你知道官方文档在哪里吗?strtotime (https://www.php.net/manual/en/function.strtotime.php) 会指向 DateFormats (https://www.php.net/manual/en/datetime.formats.date.php),但是这个格式并没有被提到。不过我看到了 Date (https://www.php.net/manual/en/function.date.php) 有提到。 - Anthony
文档在这里:https://www.php.net/manual/en/datetime.formats.compound.php 本地化标记:带有 ISO 周的 ISO 年 YY "-"? "W" W "2008W27", "2008-W28" - woens

2
  • $week:周数
  • $year:年份

因此:

$timestamp = gmmktime (0, 0 , 0 , 1, , 4 + 7*($week - 1), $year);

"4 + 7*($week - 1)"这个式子来源于ISO 8601标准,根据该标准,一年中的第一周是包含1月4日的那一周。"

жИСиЃ§дЄЇињЩдЄНеПѓйЭ†пЉЪвАЬ2011еєі1жЬИ1жЧ•вАЭж†єжНЃISO 8601ж†ЗеЗЖдїНе±ЮдЇО2010еєізђђ52еС®гАВ - Pekka
@Pekka 只有在转换需要以轻松的方式可逆时才有影响。尽管如此,还是进行了更改。 - Oswald
这将返回2008年第1周的1月4日,但根据ISO标准,该周始于2007年12月31日。 - Pekka
我不建议使用这种解决方案。在很少的情况下,我会建议使用mktime()gmmktime()来代替strtotime() - James C
一个星期是一个时间跨度,因此根据定义,不能将其转换为时间戳(即单个时间点)。唯一可以做的是获取表示该星期的时间戳。这个代表不需要是那个星期的开始(除非在需求中另有规定)。 - Oswald
@Oswald 嗯,说得好。的确需要让 OP 澄清他们想要什么。 - Pekka

0

strtotime('1/1/2011 + 4 weeks')(1/1始终在第一周; 这将使我到达第五周)。如果您想要本周中的任何时间戳,那么这就是您所需的全部内容,否则您将不得不到达本周的星期一:

$t = strtotime('1/1/2011 + 4 weeks');
$t -=  24 * 60 * 60 * date('w', $t);

更新:不再使用1/1/2011,而是使用2011年的第一个星期一。第二个计算不再需要。


жИСиЃ§дЄЇињЩдЄНеПѓйЭ†пЉЪвАЬ2011еєі1жЬИ1жЧ•вАЭж†єжНЃISO 8601ж†ЗеЗЖдїНе±ЮдЇО2010еєізђђ52еС®гАВ - Pekka
2008年第1周是在2007年12月31日。这种情况下不起作用。 - Pekka

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