如何将周数和年份转换为 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时间戳?