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

Posted

技术标签:

【中文标题】如何将周数和年份转换为 unix 时间戳?【英文标题】:How to convert week number and year into unix timestamp? 【发布时间】:2011-08-11 10:10:42 【问题描述】:

我正在尝试将日期组合成周数和年份,然后我想将该周数转换回 unix 时间戳。我该怎么做?

【问题讨论】:

请澄清“将周数转换为时间戳”的含义 【参考方案1】:

我假设您使用的是 ISO 8601 周数,并且想要 ISO 8601 周的第一天,例如Week 1 of 2011 返回January 3 2011

strtotime 可以使用YYYYWWW 格式开箱即用地执行此操作:

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

注意,周数需要两位位。

可耻的是,DateTime::createFromFormat,新的 php 5 处理日期的新方法,似乎无法解析此类信息 - 它没有“星期”占位符。

【讨论】:

虽然关于DateTime::createFromFormat() 的注释今天仍然适用,但我想补充一点,您仍然可以使用 DateTime:new DateTime('2011W01') 确实有效。 虽然这可行......你知道官方文档在哪里吗? strtotime (php.net/manual/en/function.strtotime.php) 指向 DateFormats (php.net/manual/en/datetime.formats.date.php),它没有提到这种格式。虽然我看到 Date (php.net/manual/en/function.date.php) 确实如此。【参考方案2】: $week:周数 $year:年号

然后:

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

4 + 7*($week - 1) 来自于 according to ISO 8601,一年的第一周是包含 1 月 4 日的那一周。

【讨论】:

我认为这不可靠:根据 ISO 8601,1/1/2011 仍处于 52/2010 周。 @Pekka 这仅在转换应该以微不足道的方式可逆时才重要。不过还是改了。 返回 2008 年 1 月 4 日,表示 2008 年的第 1 周,但根据 ISO,该周从 2007 年 12 月 31 日开始。 我不推荐这个解决方案。我建议在几个地方使用mktime()gmmktime() 代替strtotime() @Pekka 一周是一个时间跨度,因此根据定义,它不能转换为时间戳(即单个时间点)。唯一可以做的就是获取代表该周的时间戳。此代表不必是一周的开始(除非要求中另有说明)。【参考方案3】:

strtotime('1/1/2011 + 4 weeks')(1/1 总是在第一周;这会让我进入第五周)。如果您想要一周内的任何个时间戳,那么这就是您所需要的,否则您将不得不去本周的星期一:

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

更新:使用 2011 年的第一个星期一代替 1/1/2011。不再需要第二次计算。

【讨论】:

我认为这不可靠:根据 ISO 8601,1/1/2011 仍处于 52/2010 周。 2008 年的第 1 周是 2007 年 12 月 31 日。这在这种情况下不起作用

以上是关于如何将周数和年份转换为 unix 时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Shell 将 ISO 8601 时间戳转换为 Unix 时间戳?

如何在 kotlin 中将纪元时间戳转换为 unix 十六进制时间戳?

如何在scala中将ISO 8601时间戳转换为unix时间戳?

将时间戳转换为月份年份

如何将 SQL Server SMALLDATETIME 转换为 Unix 时间戳?

如何将 13 位 Unix 时间戳转换为日期和时间?