date / gmdate возвращает неверный номер недели

Я использую токен на основе времени, используя в качестве начального числа год и номер недели, например:

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

Вчера в воскресенье токен сломался, время на сервере и клиенте было синхронизировано (вовремя).

Проверив с помощью интерактивного инструмента cli из php, я понял, что число недель, возвращаемых PHP, равно «01» (ноль-один).

например:

Interactive mode enabled

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

На момент публикации пост был 29 декабря в 21:58 по Гринвичу, и со вчерашнего дня в 00:00 по Гринвичу он был прерван.

Проверено на php 5.5.9

0

Решение

Вместо форматирования персонажа Yиспользовать o, который вернет номер года ISO-8601.

Он имеет то же значение, что и Y, за исключением того, что если номер недели ISO (W) относится к предыдущему или следующему году, вместо этого используется этот год. (добавлено в PHP 5.1.0)

Пример:

echo gmdate('oW');
1

Другие решения

Возможно из-за разных настроек часового пояса или локали. В некоторых странах / стандартах воскресенье считается первым днем ​​недели.

Неделя (дата [режим]);

дата = значение даты. mode = целое число, обозначающее начало
неделя.

Arugment по умолчанию равен 0, что является воскресеньем, если установить значение 1,
понедельник, 2 вторник и тд.

неделя (дата, 1);

Цитируется из Как установить первый день недели в понедельник при использовании Week (Date) в PHP / MySQL?

0

Я нашел проблему.

В стандарте ISO-8601 эта неделя является 01, а не последней 2014 года. Это можно проверить Вот:

Проблема в том, что я на клиенте использую функцию, возвращающую 2015 и 1 (а я из PHP использую 2014 и 01 «201401»! == «20151»).

0
По вопросам рекламы [email protected]