【问题标题】:date/gmdate returns wrong week numberdate/gmdate 返回错误的周数
【发布时间】:2014-12-29 22:03:36
【问题描述】:

我正在使用基于时间的令牌,将年份和周数作为种子,例如:

$token = md5($salt + gmdate('YW'));

昨天周日令牌坏了,服务器和客户端的时间同步(准时)。

用php的交互式cli工具查看,发现php返回的星期数是“01”(零一)。

例如:

Interactive mode enabled

php > echo gmdate('W');
01php > echo date('W');
01php > 

在发布这篇文章时,时间是 12 月 29 日 21:58 UTC(晚上 9:58),并且自昨天 00:00 UTC 起就被打破了。

在 php 5.5.9 上测试

【问题讨论】:

    标签: php date time iso8601


    【解决方案1】:

    使用o 代替格式字符Y,它将返回ISO-8601 年份编号。

    这与 Y 具有相同的值,除了如果 ISO 周数 (W) 属于上一年或下一年,则使用该年份代替。 (在 PHP 5.1.0 中添加)

    例子:

    echo gmdate('oW');
    

    【讨论】:

      【解决方案2】:

      可能是由于不同的时区或区域设置。在某些国家/地区/标准中,星期日被视为一周的第一天。

      周(日期[模式]);

      日期 = 日期值。 mode = 一个整数,表示开始 星期。

      默认参数为 0 即星期日,将其设置为 1 将 周一、2 周二等。

      周(日期,1);

      引自How do I set first day of the week to Monday when using Week(Date) in PHP/MySQL?

      【讨论】:

      • 是的,因此我使用 ISO-8601 标准:“ISO-8601 一年中的周数,从星期一开始的周数”
      【解决方案3】:

      我发现了问题。

      在 ISO-8601 标准中,本周是 2015 年 1 月,而不是 2014 年的最后一周。可以查看here

      问题是,我在客户端使用一个函数返回 2015 和 1(而我在 PHP 中使用 2014 和 01 "201401" !== "20151")。

      【讨论】:

      • 是的。前几天 Twitter 的 API 短暂关闭,因为它认为是 2015 年 12 月,每个人的身份验证令牌都已过期。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多