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

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

【问题讨论】:

  • 请澄清“将周数转换为时间戳”的含义

标签: php strtotime strftime mktime


【解决方案1】:

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

strtotime 可以使用{YYYY}W{WW} 格式开箱即用地执行此操作:

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

注意,周数需要两位位。

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

【讨论】:

【解决方案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 日。这在这种情况下不起作用
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多