Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Как на PHP корректно прибавить месяц к дате

27.11.2015 | Категория: Web-мастеру и не только | Автор: ManHunter

Как на PHP корректно прибавить месяц к дате

Одна из интересных задач, с которой мне приходилось сталкиваться на практике при работе с датами на PHP, это так называемый "календарный месяц". То есть некий интервал дат, отличающийся на месяц. Если дата находится где-то в середине или в начале месяца, то никаких сложностей, просто увеличиваем номер месяца на единицу, при необходимости корректируем год. А проблема начинается в тех случаях, когда дата начала интервала приходится на какое-нибудь число в конце месяца. Просто увеличить значение месяца на следующий, оставив число без изменений, нельзя, полученная дата может оказаться несуществующей. Добавлять 30 или 31 день тоже некорректно, в коротком феврале итоговая дата после такого прибавления перемахнет на начало марта. Вот для наглядности несколько примеров, чтобы было понятно, о чем идет речь:
  1. //------------------------------------------------------
  2. // Дата в начале или в середине месяца
  3. //------------------------------------------------------
  4. echo date('d.m.Y',strtotime('2015-01-12 +1 month'));
  5. // 12.02.2015 - правильно
  6.  
  7. //------------------------------------------------------
  8. // Дата в конце месяца
  9. //------------------------------------------------------
  10. echo date('d.m.Y',strtotime('2015-01-29 +1 month'));
  11. // 01.03.2015 - неправильно! Ожидалось 28.02.2015
  12.  
  13. echo date('d.m.Y',strtotime('2015-01-31 +1 month'));
  14. // 03.03.2015 - неправильно! Ожидалось 28.02.2015
  15.  
  16. echo date('d.m.Y',strtotime('2015-11-30 +1 month'));
  17. // 30.12.2015 - неправильно! Ожидалось 31.12.2015
Дата следующего короткого месяца не должна превышать количество дней в нем, а переход с отметки "конец месяца" с 30 числа ноября должен соответствовать отметке "конец месяца" декабря, то есть 31 числу, а никак не 30. Аналогично, конец февраля (28 или 29 число) при увеличении даты на один календарный месяц должен превратиться в 31 марта. Функция работы с датами strtotime, несмотря на всю свою интеллектуальность, в таких случаях просто прибавляет к исходной дате 30 календарных дней или увеличивает месяц на 1.

Читать статью целиком »
Просмотров: 12940 | Комментариев: 6

Работа с Quoted-Printable строками на Ассемблере

25.04.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Механизм конвертации Quoted-Printable предназначен для представления данных, в основном состоящих из байтов, соответствующих символам, имеющим изображение в символьном наборе ASCII. Если конвертируемые данные в основном представляют собой ASCII-текст, то конечная их форма остается узнаваемой и читаемой для человека. Как правило, такое кодирование используется при передаче бинарных данных или текстов в различных кодировках через электронную почту. Сообщение, полностью состоящее из ASCII-символов, также может быть конвертировано в Quoted-Printable, что гарантирует его содержимому целостность при прохождении через всякие шлюзы, в которых происходит языковая перекодировка символов или преобразование концов строк и т.д. В результате данного кодирования все байты сообщения будут иметь такие значения, которые в дальнейшем не будут модифицированы почтовым транспортом.

Согласно спецификации, в Quoted-Printable байты должны быть представлены в соответствии со следующими правилами:
  • Каждый байт, кроме тех, которые используются для обозначения конца строки, может быть представлен с помощью двух шестнадцатеричных цифр, предваряемых знаком "=". При написании шестнадцатеричных цифр с A по F должны использоваться заглавные буквы. Кроме тех случаев, когда нижеследующие правила позволяют альтернативное кодирование, данное правило является обязательным.

  • Байты с десятичным значением с 33 по 60 и с 62 по 126 МОГУТ быть представлены ASCII-символами, соответствующими этим значениям (с '!' по '<' и с '>' по '~').

  • Пробел в кодированной строке может быть заменен на символ подчеркивания "_".

  • Байты со значениями 9 и 32 МОГУТ быть представлены как ASCII-символы "Табуляция" и "Пробел", но НЕ ДОЛЖНЫ быть представлены так в конце строки. Везде, где они представлены соответствующими ASCII-символами, за ними должен следовать символ, имеющий графическое изображение (печатный символ). В конце же строки символы табуляции и пробела должны быть представлены в соответствии с правилом #1, так как некоторые почтовые транспорты могут убирать пробелы в конце строки.

  • Конец строки в тексте письма должен быть представлен (в соответствии с RFC 822) последовательностью CRLF. Так как в каноническом представлении текста не требуется визуального отображения символов конца строки, в Quoted-Printable не используется видимых символов для обозначения конца строки.

  • В соответствии со спецификацией Quoted-Printable, длина строки не должна превышать 76 символов. В противном случае используется "мягкий" перевод строки, представимый знаком равенства. Например, если исходная строка имела вид:

    Если программист в девять утра уже на работе, значит он там же и ночевал.

    то в Quoted-Printable encoding он может быть представлена следующим образом:

    Если программист в девять утра =
    уже на работе, значит =
    он там же и ночевал.

    Это обеспечивает механизм восстановления исходной длины строки пользовательским почтовым агентом.
Для решения некоторых своих задач я написал на Ассемблере две функции - для кодирования произвольной строки по правилам Quoted-Printable и раскодирования Quoted-Printable данных. При этом, если данные не в точности соответствуют спецификации, то функция раскодирования старается максимально корректно их восстановить.

Читать статью целиком »
Просмотров: 3433 | Комментариев: 1

Работа с escape-последовательностями на Ассемблере

28.02.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с escape-последовательностями на Ассемблере

Escape-последовательности, также известные как экранированные последовательности или символьные объекты, представляют собой особый метод представления символов внутри строк. В зависимости от синтаксиса языка, ими могут кодироваться не только ASCII-символы, но и вся последовательность юникода UTF-16 и даже UTF-32. В процессе компиляции или при отображении на экране каждая escape-последовательность заменяется на соответствующий ей код символа. Кроме этого, такую запись символов очень часто используют в различных обфускаторах для скриптов PHP и JavaScript с целью затруднения визуального анализа текстовых строк или кодирования исходных текстов. Escape-последовательность обычно распознается по начальному символу обратного слеша и фиксированному количеству символов, следующих за ним.

Читать статью целиком »
Просмотров: 4510 | Комментариев: 1

Функции urldecode и urlencode на Ассемблере

30.01.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter

Функции urldecode и urlencode на Ассемблере

Моя реализация функций PHP urldecode и urlencode, а также двух их разновидностей rawurldecode и rawurlencode на Ассемблере. Алгоритм их работы описан в документации. Единственное отличие от оригинальной функции rawurlencode в том, что кодируется вся строка целиком, а не только буквенно-цифровые символы. На мой взгляд, это более логичное поведение функции с приставкой "raw". В остальном никаких отличий нет.

Читать статью целиком »
Просмотров: 4309 | Комментариев: 0

Как преобразовать кириллическую строку из UTF-8 в cp1251

26.10.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как преобразовать кириллическую строку из UTF-8 в cp1251

При разработке одной программы мне понадобилось преобразовать строки на русском языке из формата UTF-8 в формат cp1251. Внезапно выяснилось, что никакие средства WinAPI не позволяются выполнить эту операцию "одной строкой". Пришлось рассматривать даже варианты с табличным преобразованием, но потом нашлось более простое решение задачи. Алгоритм преобразования получился необычный, но зато гарантированно рабочий. Может быть это поможет сохранить время и нервы кому-нибудь еще.

Читать статью целиком »
Просмотров: 8126 | Комментариев: 8

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0472 сек.) / Память: 4.75 Mb
Наверх