Тз примеры: Примеры технических заданий (ТЗ)

Содержание

Стандарты и шаблоны для ТЗ на разработку ПО / Хабр

Введение

Недавно ко мне обратились, чтобы я посоветовал стандарты для написания технического задания (ТЗ) на разработку автоматизированных систем (АС) и программного обеспечения (ПО). Вот думаю, сейчас зайду в Яндекс, найду подходящую статейку и отправлю её. Но не тут-то было! Одной статьи, где перечисляются стандарты для ТЗ, включая шаблоны и примеры готовых документов, я не нашел. Придется сделать такую статейку самому…

И так, основные стандарты, методологии и своды знаний, где упоминается ТЗ или SRS (Software (or System) Requirements Specification):

• ГОСТ 34
• ГОСТ 19
• IEEE STD 830-1998
• ISO/IEC/ IEEE 29148-2011
• RUP
• SWEBOK, BABOK и пр.

ГОСТ 34

ГОСТ 34.602-89 Техническое задание на создание автоматизированной системы рекомендует структуру ТЗ на создание именно СИСТЕМЫ, в которую входят ПО, аппаратное обеспечение, люди, которые работают с ПО, и автоматизируемые процессы.

Согласно ГОСТ 34 техническое задание должно включать следующие разделы:

1. Общие сведения
2. Назначение и цели создания (развития) системы
3. Характеристика объектов автоматизации
4. Требования к системе
5. Состав и содержание работ по созданию системы
6. Порядок контроля и приемки системы
7. Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие
8. Требования к документированию
9. Источники разработки

При разработке ТЗ для государственных проектов Заказчики, как правило, требуют соблюдение именно этого стандарта.

ГОСТ 19

“ГОСТ 19.ххх Единая система программной документации (ЕСПД)” — это комплекс государственных стандартов, устанавливающих взаимоувязанные правила разработки, оформления и обращения программ (или ПО) и программной документации. Т.е. этот стандарт относится к разработке именно ПО.


Согласно ГОСТ 19.201-78 Техническое задание, требования к содержанию и оформлению техническое задание должно включать следующие разделы:

1. Введение;
2. Основания для разработки;
3. Назначение разработки;
4. Требования к программе или программному изделию;
5. Требования к программной документации;
6. Технико-экономические показатели;
7. Стадии и этапы разработки;
8. Порядок контроля и приемки;
9. Приложения.

Естественно ГОСТ 34 (и 19) уже устарели, и я не люблю их использовать, но при правильном интерпретации стандартов, можно получить хорошее ТЗ, см. Заключение.

IEEE STD 830-1998

Достаточно хорошее определение стандарта 830-1998 — IEEE Recommended Practice for Software Requirements Specifications дано в самом его описании:

Описывается содержание и качественные характеристики правильно составленной спецификации требований к программному обеспечению (SRS) и приводится несколько шаблонов SRS. Данная рекомендуемая методика имеет своей целью установление требований к разрабатываемому программному обеспечению, но также может применяться, чтобы помочь в выборе собственных и коммерческих программных изделий.

Согласно стандарту техническое задание должно включать следующие разделы:

1. Введение

  • 1. Назначение
  • 2. Область действия
  • 3. Определения, акронимы и сокращения
  • 4. Ссылки
  • 5. Краткий обзор

2. Общее описание

  • 1. Взаимодействие продукта (с другими продуктами и компонентами)
  • 2. Функции продукта (краткое описание)
  • 3. Характеристики пользователя
  • 4. Ограничения
  • 5. Допущения и зависимости

3. Детальные требования (могут быть организованы по разному, н-р, так)

  • 1. Требования к внешним интерфейсам
    • 1. Интерфейсы пользователя
    • 2. Интерфейсы аппаратного обеспечения
    • 3. Интерфейсы программного обеспечения
    • 4. Интерфейсы взаимодействия
  • 2. Функциональные требования
  • 3. Требования к производительности
  • 4. Проектные ограничения (и ссылки на стандарты)
  • 5. Нефункциональные требования (надежность, доступность, безопасность и пр.)
  • 6. Другие требования

4. Приложения

5. Алфавитный указатель

На самом деле новичку достаточно трудно понять, что должно содержаться в данных разделах по вышеприведенной структуре (как и в случае с ГОСТом), поэтому нужно читать сам стандарт, который легко найти в Интернете. Как и примеры, правда, на англ. языке.

Мне же больше нравится адаптированный шаблон Карла Вигерса, который я использую при разработки ТЗ для коммерческих компаний. И вообще дедушка Вигерс предоставляет множество полезных рекомендаций по работе с требованиями (куда идут деньги при покупке этих рекомендаций, читайте в начале красным). Ну а его книжку вы уже несколько раз, надеюсь, перечитали.

ISO/IEC/ IEEE 29148-2011

Стандарт IEEE 29148-2011 обеспечивает единую трактовку процессов и продуктов, используемых при разработке требований на протяжении всего жизненного цикла систем и программного обеспечения. Он приходит на смену стандартов IEEE 830-1998, IEEE 1233-1998, IEEE 1362-1998.

Данный стандарт содержит два шаблона спецификации требований:

• System requirements specification (SyRS)
• Software requirements specification (SRS)

System Requirements Specification (SyRS) определяет технические требования для выбранной системы и удобства взаимодействия предполагаемой системы и человека. Она определяет высокоуровневые требования к системе с точки зрения предметной области, а также информацию об общей цели системы, ее целевой среде и ограничениях, допущениях и нефункциональных требованиях. Она может включать в себя концептуальные модели, спроектированные для иллюстрации содержания системы, сценариев использования, основных сущностей предметной области, данных, информаций и рабочих процессов. Из определения следует, что это аналог ТЗ, описанного в ГОСТ 34.

SyRS может содержать следующие разделы:

1. Введение

  • 1. Назначение системы
  • 2. Содержание системы (границы системы)
  • 3. Обзор системы
    • 1. Содержание системы
    • 2. Функции системы
    • 3. Характеристики пользователей
  • 4. Термины и определения

2. Ссылки

3. Системные требования

  • 1. Функциональные требования
  • 2. Требования к юзабилити
  • 3. Требования к производительности
  • 4. Интерфейс (взаимодействие) системы
  • 5. Операции системы
  • 6. Состояния системы
  • 7. Физические характеристики
  • 8. Условия окружения
  • 9. Требования к безопасности
  • 10. Управление информацией
  • 11. Политики и правила
  • 12. Требования к обслуживанию системы на протяжении ее жизненного цикла
  • 13. Требования к упаковке, погрузке-разгрузки, доставке и транспортировке

4. Тестирование и проверка (список необходимых приемочных тестов, которые отражают зеркально раздел 3)

5. Приложения

  • 1. Предположения и зависимости
  • 2. Аббревиатуры и сокращений

SRS это спецификация требований для определенного программного изделия, программы или набора программ (продукт), которые выполняют определенные функции в конкретном окружении. Из определения следует, что это аналог ТЗ, описанного в ГОСТ 19, а по структуре очень напоминает SRS из стандарта IEEE 830.

SRS может содержать следующие разделы:

1. Введение

  • 1. Назначение
  • 2. Содержание (границы)
    • 3. Обзор продукта
    • 1. Взаимодействие продукта (с другими продуктами и компонентами)
    • 2. Функции продукта (краткое описание)
    • 3. Характеристики пользователей
    • 4. Ограничения
  • 4. Термины и определения

2. Ссылки

3. Детальные требования

  • 1. Требования к внешним интерфейсам
  • 2. Функции продукта
  • 3. Требования к юзабилити
  • 4. Требования к производительности
  • 5. Требования к логической структуре БД
  • 6. Ограничения проектирования
  • 7. Системные свойства ПО
  • 8. Дополнительные требования

4. Тестирование и проверка (список необходимых приемочных тестов, которые отражают зеркально раздел 3)

5. Приложения

  • 1. Предположения и зависимости
  • 2. Аббревиатуры и сокращений

Данный стандарт достаточно сложно найти в открытом виде в Интернете, но постараться можно, и опять же только на англ.

RUP

Структура SRS в RUP(Rational Unified Process) представляет собой документ, в котором необходимо описать артефакты, полученные в процессе специфицирования требований.

Шаблон SRS в RUP адаптирован из стандарта IEEE STD 830 и содержит два варианта:

• Традиционный шаблон SRS со структурированными функциональными требованиями по функциям Системы, максимально похож на 830 стандарт.
• Упрощенный шаблон SRS со структурированными функциональными требованиями в виде вариантов использования (use cases):

1. Введение.

  • 1. Цель.
  • 2. Краткая сводка возможностей.
  • 3. Определения, акронимы и сокращения.
  • 4. Ссылки.
  • 5. Краткое содержание.

2. Обзор системы

  • 1. Обзор вариантов использований.
  • 2. Предположения и зависимости.

3. Детальные требований

  • 1. Описание вариантов использования.
  • 2. Дополнительные требования.
  • 3. Другие функциональные требования.
  • 4. Нефункциональные требования.

4. Вспомогательная информация.

Естественно, что в Интернете можно найти шаблон и примеры SRS от RUP.

SWEBOK, BABOK и пр.

SWEBOK, BABOK, а также множество других методологий разработки ПО и сводов знаний при упоминании SRS ссылаются на вышеупомянутые зарубежные стандарты.

Также стоит сказать, что для описания требований к АС и ПО используются и другие виды документов, кот каждый называет по разному: FRD (Functional Requirements Document), RD (Requirements Document), ПЗ (Постановка задачи или Пояснительная записка) и пр. Но это все производные документы от вышеупомянутых стандартов, не имеющих отраслевой стандартизации, хотя, в некоторых случаях, уже и с устоявшейся терминологией.

А как же Agile?

Я скажу одной фразой из Манифеста Agile: “Working software over comprehensive documentation”. Поэтому в Agile документации отводится совсем мало места.

Мое же убеждение, что разработать АС без ТЗ можно (используя техники/рекомендации Agile), но вот в дальнейшем сопровождать — невозможно. Поэтому сразу задумайтесь, как вы будете писать ТЗ и другую документацию, при разработке ПО по Agile.

Заключение

Как говорится, каждому проекту свое техническое задание. При правильном использовании любого из вышеперечисленных стандартов можно брать эти шаблоны для написания ТЗ, естественно адаптируя их под себя.

Но главное, чтобы ТЗ не превращалось в ХЗ, а, именно, содержание (наполнение) в ТЗ — самое главное! Но это уже совсем другая история… Если есть интерес, то можно пройти он-лайн курс Разработка и управление требованиями к ПО.

Ну а кто дочитал до конца — тому бонус: пример ТЗ, который я писал много лет назад (сейчас уже просто аналитиком давно не работаю, да и другие более удачные примеры запрещает открывать на всеобщее обозрение NDA).

Также рекомендую ознакомиться со следующими материалами:

  • Презентацией Юрия Булуя Классификация требований к программному обеспечению и ее представление в стандартах и методологиях.
  • Анализ требований к автоматизированным информационным системам. Лекция 11: Документирование требований.
  • Правила составления Software requirements specification (читать вместе с комментариями)
  • Примеры ТЗ и другой документации по разработке АС для МЭР
  • ГОСТ-овский стиль управления. Статья Gaperton по правильной работе с ТЗ по ГОСТ
  • Шаблоны документов для бизнес-аналитиков из группы ВК «Business Analysis Magazine»

Как составить техническое задание (ТЗ) для копирайтера на английском + Пример

Статья от HighTime Agency — российского SEO-агентства, которое занимается продвижением SaaS-компаний с 2011 года. Команда агентства имеет успешный опыт продвижения своих и клиентских проектов в США, Германии, Франции и России. 

Автор — основатель HighTime Agency: Роман Макаров. В статье: советы по выбору темы и сбору информации для информационной статьи, пошаговый образец и пример для создания грамотного ТЗ копирайтеру.  

Информационные статьи помогают при прокачке money-статей (то есть статей, приносящих основной доход). Дело в том, что людям помимо обзоров на товары и услуги, в которых мы вешаем реферальные ссылки, интересны инфо-статьи, так как они помогают упростить им жизнь и получить выгоду.

Что в статье:

  1. Как это работает?
  2. Что из себя представляют инфо-статьи?
  3. Какие шаги к написанию ТЗ для информационной статьи?
  4. Что дальше?
  5. О чем важно помнить?

Money-статьи приносят больше ценности нам, чем пользователям. Но в то же время важно, чтобы сайт не был сборником обзоров для заработка на читателях. Асессоры Google оценивают качество ресурсов и понижают в рейтинге сайты без полезного для пользователей контента. Люди со временем также начинают понимать, что сайт не настолько хорош, если кругом одни статьи с рефералками. И нам не нужны «пустые» статьи, чтобы были, потому что «надо», так они не работают и не приносят доход. Задача не из легких.

Профиль сайта из Индии в Ahrefs без инфо-статей

Для решения этой проблемы подойдут информационные статьи. В них будет содержаться полезная для конечного пользователя информация (например, ресурсы и гайды, связанные с товарами, которые мы продвигаем). Плюсом эти статьи будут напрямую связаны с нашими основными статьями, делиться с ними трафиком и тем самым приносить больший доход. Выглядят инфо-статьи приятно и полезно, и для пользователей, и для всевидящего ока Google, и денег нам помогают заработать. Все рады.

Если написать инфо-статьи качественно, другие ресурсы будут ссылаться на них, тем самым нагоняя нам трафик, и делая наш сайт круче. Ну разве не восхитительно?

Как это работает?

Информационные статьи не хуже money-старей, а иногда даже лучше, генерируют трафик. В случае инфо-статей мы зарабатываем деньги не напрямую, а через связку инфо-статьи и money-статьи ссылкой. То есть мы ненавязчиво привлекаем пользователей, ищущих полезную информацию, на наш сайт, копим авторитет ресурса и монетизируем трафик.

Что из себя представляют инфо-статьи? 

К таким статьям могут относиться:

  • How-To статьи. Это своеобразный гайд с шагами, советами, хитростями, выполняя или придерживаясь которых можно достичь определенного результата. Пример заголовка статьи — How to Make [keyword] in 3 Steps. Примеры статей: 
    — https://www.instructables.com/id/How-to-Eat-a-Banana-Like-a-Monkey/ 
    — https://blog.hubspot.com/blog/tabid/6307/bid/33363/memejacking-the-complete-guide-to-creating-memes-for-marketing.aspx 
    — https://www.lifehack.org/articles/money/the-six-best-ways-to-get-rich.html 
  • Статьи с советами и идеями, где можно найти вдохновение для своего дела или работы. Пример заголовка статьи — N Ways/Things to [keyword]. Примеры статей:
    — https://backlinko.com/find-content-ideas 
    — https://www.starwars.com/news/5-signs-you-might-be-a-sith-in-training
    — https://backlinko.com/content-marketing-tips 
  • Research-статьи. Статьи-исследования, то есть мы ищем только трастовые источники с исследованиями для написания статьи (.edu + .gov + журналы-сборники научных статей).

Как сделать качественную инфо-статью, чтобы она точно принесла пользу сайту? Для этого нужно проделать следующие шаги. 

Какие шаги к написанию ТЗ для инфо-статьи?

Одна из самых главных вещей для составления технического задания для копирайтера — контент-план. Это список ключевых запросов, сгруппированный по статьям. Для одной статьи — одна группа ключевых запросов. На их основе контент-план помогает составить правильное ТЗ для копирайтера. А авторам будет проще и понятнее о чем писать статьи. 

Пример контент-плана

И вот, у нас есть контент план под рукой, мы готовы писать. Что делать дальше?

1. Изучаем ключи из контент-плана

Смотрим частотность и на какие моменты (хвосты в ключах) пользователи обращают свое внимание. Так мы соберем примерные темы, которые нужно осветить в статье. Важно понимать, что есть основной ключ, вокруг которого пишется вся статья, и именно он идет в заголовок. И есть дополнительные ключи с хвостами, которые помогают найти информацию вокруг основного ключа. Основной ключ находится через инструменты SEO-анализа (например, Ahrefs). Подбирает ключи автор контент-плана (не обязательно вы).

Так, если мы посмотрим на пример контент-плана выше, мы будем писать статью «как чистить кухонную мойку» (How to Clean Kitchen Sink). Смотрим на хвосты: 

  • Добавляем информацию о том как чистить не только раковины, но и слив (sink drain).
  • Обращаем внимание про нержавеющую сталь (stainless steel), нам нужно будет указать особенности мытья раковины из этого материала + другие виды материалов раковин и как их чистить.
  • Добавляем информацию об использовании «домашних методов», в данном случае — пищевая сода и уксус (baking soda + vinegar).
  • Также можно дополнительно расширить гайд, добавив информацию про то, как дезинфицировать мойку (sanitize + disinfect).
«Хвосты» — наше всё

2. Определившись с темами, начинаем собирать информацию

Ищем всю возможную информацию, при этом обязательно сохраняем ссылки на ресурсы. Даже если мы не будем использовать все, полезно иметь полных охват ресурсов, ведь иногда понадобиться заменить источник на другой. Так вместо поиска и траты дополнительных ресурсов времени, мы просто обратимся к уже готовому списку.

Начинаем с банального — вводим в поисковую строку Google ключ — how to clean kitchen sink. Далее идем смотреть топы, обращаем внимание и на 2-3 страницы. Также можно посмотреть ссылки на другие статьи внутри статей конкурентов, собираем идеи, мысли и ресурсы в отдельный файлик. Когда кажется, что уже все найдено, начинаем перебирать ключи из нашего контент-плана, и ищем дополнительные идеи там.

Промежуточный вариант файлика со всем ресурсами статьи

3. При сборе информации уже начинаем продумывать примерный макет статьи

При массиве текста, чтобы пользователям было не скучно читать статью, нам просто необходимо «вдохнуть в нее жизнь». Какими бы интересными ни были тема и текст, без хорошего визуала она ничем не отличается от вырезки из словаря или заумной научной работы, что в нашем случае недопустимо. 

Для этого нам нужны видео c YouTube, картинки с лицензией на использование и изменение, графики, диаграммы, таблицы, списки. Необязательно на этом этапе иметь готовый список ссылок на картинки. А вот список видео желательно уже иметь, ведь для каждого должно быть прописано, связанное с текстом статьи, описание, а это нужно продумать заранее.

Подборка видео

4. Структурируем собранную информацию

Ищем места, которые необходимо «закрыть» другим источником или другой темой/информацией. Стараемся выстроить логичную цепочку из тем и блоков информации. Добавляем ссылки на видео в статью в нужные и логичные места. 

Структурированная информация

5. Пишем текст технического задания

Прописываем цели, задачи, аудиторию, структуру и советы по оформлению. Не нужно много воды. Нужно достаточно подробно и емко объяснить автору, что от него требуется, чтобы не возникало много дополнительных вопросов или вам потом не пришлось бы вносить кучу правок на этапе приема статьи.  

Тут как раз пригодится структура, которую мы прописали выше, просто нанизываем больше «мяса» на костяк структуры. 

Вот как изменилась наша начальная структура в конечном ТЗ

Обратите внимание на пункт I. Title and description. В этом пункте мы указываем, как копирайтеру нужно написать одни из главных инструментов SEO — meta title и meta description, которые мы затем будем добавлять в сниппет — визитную карточку нашей статьи. Чтобы понять, что это такое, зачем нужно, и как лучше их писать читайте статьи ниже, а также добавьте их в ТЗ для копирайтеров:

— https://blog.alexa.com/seo-meta-descriptions/ 

— https://yoast.com/meta-descriptions/ 

А если вкратце, то meta title и meta description — это лицо вашей статьи, потому что именно они добавляются в сниппет, который появляется в поисковой выдаче, и именно эти инструменты помогут привлечь внимание к статье. Поэтому не стоит пренебрегать ими.

Сниппет. Филетовый заголовок — meta title. Серый текст после даты — meta description

Конечно же не забываем указывать автору, чтобы он добавил ссылку на нашу money-статью, которую необходимо прокачать.

Ради этого все и затевалось

Основные цель и задача, должны быть прописаны в самом начале. Обязательно укажите свой сайт, чтобы автор примерно понимал стиль написания, аудиторию и в целом настроение сайта. Чтобы автор мог адаптироваться под ваш проект.

Если хотите, чтобы Ваш текст был «живым», то и попросите написать его «живым» — с персональным мнением, обращением к читателю, эмоциями и эмодзи:)

6. Рассчитываем и прописываем примерное количество слов

Чтобы посчитать количество слов, необходимо оценить несколько факторов: объем информации, который мы нашли и хотим его осветить в статье, посмотреть сайты конкурентов, в целом оценить конкуренцию по нише или ключу. И если с информацией, которую мы нашли сами и хотим добавить в статью все более-менее понятно, то с конкурентами нужно учитывать несколько факторов:

Считаем количество слов в статьях конкурентов

Забиваем основной ключ в поиск, считаем количество слов в статьях конкурентов (вбиваем текст всей статьи в знакосчиталки, например, https://www. 8nog.com/counter/), на основе среднего и максимального количества накидываем ещё примерно 100-200 слов. Наша задача перебить самую большую и жирную статью по ключу и в количестве написанных слов, и в качестве. Идеально — максимум слов, и все нужные и полезные.

Самая большая и полезная статья на wikihow, поэтому берем ее за образец
Анализируем качество статей конкурентов

Смотрим сколько реальных конкурентов по нашему основному ключу, насколько у них полезный контент и насколько хорошо составлена статья. Таким образом мы понимаем, что нам либо можно сократить количество найденной информации, либо наоборот отправиться на дополнительный анализ, если конкуренты очень хороши.

Примерная таблица с анализом конкурентов

КонкурентВыглядит, пользаВердикт
https://www.bhg.com/homekeeping/house-cleaning/tips/how-to-clean-kitchen-sinks-drains/ Короткая статья, мало медиа (фото, видео, графики).
Информации много, но есть ещё что добавить им.
Статья выглядит скучно, слабый конкурент. Обратить внимание на оформление с медиа (должно быть много).
https://www.realsimple.com/home-organizing/cleaning/how-to-clean-your-kitchen-sinkКороткая статья, нет медиа.
Информация разнообразная.
Слабый конкурент, статья выглядит скучно. Взять ключи How to сlean a sink faucet + garbage disposal
https://www.oxo.com/blog/cleaning-and-organizing/best-way-clean-kitchen-sink/Короткая статья, больше медиа, неплохо оформлено.
Очень мало информации.
Слабый конкурент, выглядит лучше, но инфы мало. Можно взять оформление шагов, хорошо выглядит.
https://www.popsugar.com/smart-living/How-Clean-Your-Stainless-Steel-Sink-30688216Короткая статья, больше медиа, но однообразно.
Занишевались под stainless steel. Но и так не особо подробно описали.
Занишевались, не совсем наши конкуренты, но даже так — мало инфы.
https://www.simplemost.com/how-clean-disinfect-kitchen-sink/Прямо коротулька. Без медиа.
Нет комментариев, слов 800 от силы.
Совсем не конкурент.
https://www.thekitchn.com/how-to-clean-your-kitchen-sink-249020Короткая статья, больше медиа.
Информации мало.
Слабо.
https://www.wikihow.com/Clean-a-Kitchen-SinkКак обычно у WikiHow, много всего, картинки. списки, инструкции. ГИФКИ!Информации много.Основной конкурент, 1600 слов, будем ориентироваться на них. Нужно попробовать намутить гифки, выглядит классно + Q&A и Tips. А еще крутой интерактивный  чек-лист, что нужно для чистки.
https://truemoneysaver.com/diy/how-to-clean-stainless-steel-sink/Добротная статья, живые фотки, немного частями проседает медиа (не хватает в паре мест).
Много информации + посчитана стоимость (особенность сайта).
2 конкурент. В целом, все моменты учтены, их статья меньше, чем WikiHow.

В итоге анализируем и совмещаем информацию из двух предыдущих пунктов, так понимаем примерное количество слов для статьи. Если есть сомнение, и ниша не сильно конкурентная, лучше указать меньше слов, чтобы посмотреть, как сам автор справится со статьей. Добавить всегда можно, а вот убрать будет тяжелее. НО если конкуренция по ключу высокая, то нужно семь раз подумать — посчитать количество слов и один раз составить качественное ТЗ для копирайтера .

По итогу что мы имеем после анализа: у нас два хороших конкурента со статьями в 1500-1600 слов. У них достаточно медиа и различных блоков. Так у нас появляются в ТЗ пункты про How to сlean a sink faucet + garbage disposal + Q&A + Tips. Решаем, что самое лучшее — это поставить лимит слов в 1800-2000, так мы обойдем текущих конкурентов + будет чем крыть будущих. А также на будущее думаем, как добавить интерактивный чек лист, чтобы самим мониторить, что уже есть для мойки, а что нужно раздобыть и как сделать гифки, чтобы выглядело прям ВАУ. Но это уже будет на этапе публикации статьи.

7. Ещё раз проверяем ТЗ статьи, мысленно представляя макет

Тут же важно откорректировать техническое задание в соответствии с количеством слов и повторным анализом конкуренции. Все основные изменения, которые появились после анализа конкурентов, описаны выше.

8. Убедившись, что вы выложились на полную, и особо добавить больше нечего, отправляем ТЗ автору

Вот и сам пример готового ТЗ копирайтеру на информационную статью для сайта на английском языке.

Что дальше?

Далее проходит следующий этап работы — редактирование с автором. Вносятся поправки в статью, согласно ТЗ. И все продолжается, пока статья не будет устраивать вас на 99,9%. Техническое задание, своего рода, юридический документ, на который вы можете ссылаться, когда автор в порыве своего вдохновения отклонился от темы, либо раздул объем статьи, либо вовсе забыл раскрыть одну из важных тем.  

О чем важно помнить?

От написания технического задания для копирайтера зависит конечный продукт — статья. Статья — это инструмент заработка, в который мы вкладываемся заранее. Поэтому нужно осознавать всю важность и ценность правильно собранного и прописанного ТЗ. Особенно важно это правило для конкурентных ниш.  Логика проста: выше конкуренция по ключу → нужна больше и качественнее статья → нужно много слов + хороший автор → нужно больше денег на статью → выше риски и больше потеряешь, если статья не выстрелит. Но в таких нишах гораздо больше шансов получить высокий трафик, который потом можно конвертировать в высокий доход. Поэтому к написанию технического задания нужно подходить с холодной головой и горячим сердцем. Четко анализировать и добавлять уместный креатив. Дерзайте!

 

  • Об авторе
  • Недавние публикации

Роман Макаров

Основатель, генеральный директор и руководитель отдела роста в HighTime Agency

11 лет продвигает SaaS-компании в США, Франции, Германии, ОАЭ и России. Увеличил поток трафика и триалов в 3 раза для компании EdTech. Создал 2 онлайн-журнала с нуля и продал с мультипликатором x33.


Роман Макаров недавно публиковал (посмотреть все)

tz — документация dateutil 2.8.2

Этот модуль предлагает реализации часового пояса, подклассы абстрактного datetime.tzinfo тип. Существуют классы для обработки формата tzfile. файлы (обычно находятся в /etc/localtime , /usr/share/zoneinfo , д.), строка окружения TZ (во всех известных форматах), заданные диапазоны (с помощью от относительных дельт), часовой пояс локальной машины, часовой пояс с фиксированным смещением и UTC часовой пояс.

Объекты

dateutil.tz. Всемирное координированное время

Удобный экземпляр dateutil.tz.tzutc .

Новое в версии 2.7.0.

Функции

dateutil.tz. гетц ( имя = нет )

Получить объект часового пояса из строкового представления

Эта функция предназначена для получения подкласса tzinfo . который лучше всего представляет часовой пояс, который будет использоваться, если POSIX Переменная TZ была установлена ​​на то же значение.

Если в не передается аргумент или пустая строка, gettz , местное время возвращается:

 >>> получить()
tzfile('/etc/localtime')
 

Эта функция также является предпочтительным способом сопоставления ключей базы данных IANA tz. до tzfile объектов:

 >>> gettz('Тихий океан/Киритимати')
tzfile('/usr/share/zoneinfo/Pacific/Kiritimati')
 

В Windows стандарт расширен за счет включения специфичных для Windows имена зон, предоставленные операционной системой:

 >>> gettz('Стандартное время Египта')
tzwin('Стандартное время Египта')
 

При передаче спецификации часового пояса строки в стиле GNU TZ возвращается цстр объект:

 >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3')
tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3')
 
Параметры: имя — название часового пояса (IANA, или, в Windows, ключи Windows), местоположение tzfile(5) файл zoneinfo или TZ часовой пояс с переменным стилем спецификатор. Пустая строка, без аргумента или None интерпретируется как местное время.
Возвращает: Возвращает экземпляр одного из dateutil tzinfo подклассы.

Изменено в версии 2.7.0: После версии 2.7.0 любые два вызова gettz с использованием одного и того же входные строки вернут один и тот же объект:

 >>> tz.gettz('Америка/Чикаго') is tz.gettz('Америка/Чикаго')
Истинный
 

Помимо повышения производительности, это гарантирует, что Семантика «той же зоны» используется для даты и времени в той же зоне.

гетц. нокаш ()

Некэшированная версия gettz

классметод gettz. cache_clear ()
dateutil.tz. свернуть ( dt , свернуть = 1 ) [источник]

Предоставляет единый интерфейс для назначения атрибута fold datetime как до, так и после реализации PEP-495.

Параметры: fold — значение атрибута fold в возвращаемой дате и времени. Этот должен быть либо 0, либо 1.
Возвращает: Возвращает объект, для которого возвращает getattr(dt, 'fold', 0) сложите для всех версий Python. В версиях до Python 3.6, это _DatetimeWithFold объект, который является подкласс datetime.datetime с раз добавлен атрибут, если кратно равно 1.

Новое в версии 2.6.0.

dateutil.tz. datetime_ambiguous ( dt , tz=нет )[источник]

Учитывая дату и время и часовой пояс, определить, является ли данная дата и время неоднозначно (т. е. если есть два времени, различающихся только их DST положение дел).

Параметры:
  • dt — A datetime. datetime (чей часовой пояс будет игнорироваться, если tz предоставляется.)
  • tz — файл datetime.tzinfo с поддержкой атрибута fold . Если Нет или не указано, будет использоваться собственный часовой пояс даты и времени.
Возвращает:

Возвращает логическое значение независимо от того, является ли «время стены» неоднозначным в тз .

Новое в версии 2.6.0.

dateutil.tz. datetime_exists ( dt , tz=нет )[источник]

Учитывая дату и время и часовой пояс, определить, является ли данная дата и время попал бы в пропасть.

Параметры:
  • dt — A datetime.datetime (чей часовой пояс будет игнорироваться, если тз предоставляется. )
  • tz — файл datetime.tzinfo с поддержкой атрибута fold . Если Нет или не указано, будет использоваться собственный часовой пояс даты и времени.
Возвращает:

Возвращает логическое значение независимо от того, существует ли «время стены» в тз .

Новое в версии 2.7.0.

dateutil.tz. resolve_imaginary ( dt )[источник]

Учитывая дату и время, которая может быть мнимой, вернуть существующую дату и время.

Эта функция предполагает, что воображаемая дата-время представляет то, что время стены было бы в зоне, если бы переход смещения не произошел, поэтому он всегда будет смещаться вперед при изменении смещения перехода.

 >>> from dateutil import tz
>>> из даты и времени импортировать дату и время
>>> Нью-Йорк = tz.gettz('Америка/Нью-Йорк')
>>> print(tz. resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC)))
2017-03-12 03:30:00-04:00
>>> KIR = tz.gettz('Тихий океан/Киритимати')
>>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=КИР)))
1995-01-02 12:30:00+14:00
 

В качестве примечания: datetime.astimezone() гарантированно выдает действительный, существующая дата и время, поэтому для получения существующая дата-время, однако это обычно «возвращается» к более раннему времени вместо того, чтобы перейти на сторону STD (хотя никаких гарантий не дается об этом поведении).

Параметры: dt – A datetime.datetime , который может существовать, а может и не существовать.
Возвраты: Возвращает существующий datetime.datetime . Если dt не было мнимый, возвращаемый datetime гарантированно будет тем же объектом передается в функцию.

Новое в версии 2.7.0.

Классы

класс dateutil.tz. цуц [источник]

Это объект tzinfo, представляющий часовой пояс UTC.

Примеры:

 >>> из импорта даты и времени *
>>> из импорта dateutil.tz *
>>> datetime.now()
datetime.datetime(2003, 9, 27, 9, 40, 1, 521290)
>>> datetime.now(tzutc())
datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc())
>>> datetime.now(tzutc()).tzname()
'УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ'
 

Изменено в версии 2.7.0: tzutc() теперь является одноэлементным, поэтому результат tzutc() будет всегда возвращать один и тот же объект.

 >>> из dateutil.tz импортировать tzutc, UTC
>>> tzutc() — это tzutc()
Истинный
>>> tzutc() — это UTC
Истинный
 
класс dateutil.tz. tzoffset ( имя , смещение )[источник]

Простой класс для представления фиксированного смещения от UTC.

Параметры:
  • имя – Имя часового пояса, которое будет возвращено, когда Вызывается tzname() .
  • offset — смещение часового пояса в секундах или (начиная с версии 2.6.0, представленное как объект datetime.timedelta ).
класс dateutil.tz. tzlocal [источник]

Подкласс tzinfo , построенный вокруг функций часового пояса time .

класс dateutil.tz. tzwinlocal [источник]

Класс, представляющий информацию о местном часовом поясе в реестре Windows

Хотя dateutil.tz.tzlocal выполняет системные вызовы (через время модуль) для получения информации о часовом поясе, tzwinlocal извлекает правила прямо из реестра Windows и создает объект типа dateutil. tz.tzwin .

Поскольку в Windows нет эквивалента time.tzset() , на Windows, экземпляры dateutil.tz.tzlocal всегда будут отражать настройки часового пояса на момент запуска процесса , что означает изменения настроек часового пояса машины во время выполнения программы в Windows , а не , будет отражаться dateutil.tz.tzlocal . Поскольку tzwinlocal читает реестр напрямую, на него не влияют Эта проблема.

Примечание

Доступно только в Windows

дисплей ()

Вернуть отображаемое имя часового пояса.

переходы ( год )

Для заданного года получить время перехода на летнее время, выраженное всегда на стороне стандартного времени. Для зон без переходов это функция возвращает Нет .

Параметры: год – Год, переходы которого вы хотите запросить.
Возвраты: Возвращает кортеж из объектов datetime.datetime , (dston, dstoff) для зон с ежегодным переходом на летнее время или Нет для зон с фиксированным смещением.
класс dateutil.tz. tzrange ( stdabbr , stdoffset=Нет , dstabbr=Нет , dstoffset=Нет , start=Нет , конец=Нет )[источник]

Объект tzrange представляет собой часовой пояс, определяемый набором смещений и сокращения, эквивалентные способу указания переменной TZ в POSIX-подобных системах, но с использованием дельта-объектов Python для указания летнего времени начало, конец и смещения.

Параметры:
  • stdabbr – сокращение стандартного времени (например, 'EST' ).
  • stdoffset

    Целое число или объект datetime.timedelta или эквивалент указание базового смещения от UTC.

    Если не указано, используется +00:00.

  • dstabbr

    Аббревиатура летнего/летнего времени (например, «EDT» ).

    Если указано, без другой информации о переходе на летнее время предполагается, что наступает летнее время. и поведение по умолчанию или dstoffset , начало и конец использовал. Если не указано и не указана другая информация о переходе на летнее время, предполагается, что в этой зоне нет летнего времени.

    Если это не указано, а другая информация о переходе на летнее время указана или , Летнее время происходит в зоне, но аббревиатура часового пояса остается без изменений.

  • dstoffset — Целое число или объект datetime.timedelta или эквивалент указание смещения UTC во время летнего времени. Если не указано и любое другое летнее время информация указана, предполагается, что это смещение STD +1 час.
  • начало

    A относительнаядельта.относительнаядельта объект или эквивалентное указание время и время года, когда начинается переход на летнее время. К указать, например, что переход на летнее время начинается в 2 часа ночи во 2-е воскресенье в Март, проход:

    относительная дельта(часы=2, месяц=3, день=1, день недели=ВС(+2))

    Если не указано и указана любая другая информация о переходе на летнее время, по умолчанию значение равно 2 часам ночи в первое воскресенье апреля.

  • end — Объект relativedelta.relativedelta или аналогичный представляющие время и время года, когда переход на летнее время заканчивается тем же методом спецификации, что и в начало . Одно примечание что это должно указывать на первый раз в зоне стандарта , поэтому, если переход происходит в 2 часа ночи в зоне летнего времени, и часы переводятся вспять 1 час до 01:00 установите для параметра часа значение +1.

Примеры:

 >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT")
Истинный
>>> из импорта dateutil.relativedelta *
>>> range1 = tzrange("EST", -18000, "EDT")
>>> range2 = tzrange("EST", -18000, "EDT", -14400,
... относительная дельта (часы = + 2, месяц = ​​4, день = 1,
...день недели=ВС(+1)),
... относительная дельта (часы = + 1, месяц = ​​10, день = 31,
...день недели=SU(-1)))
>>> tzstr('EST5EDT') == диапазон1 == диапазон2
Истинный
 
класс dateutil.tz. tzstr ( s , posix_offset=False )[источник]

tzstr объекты — это объекты часового пояса, заданные строкой часового пояса как он будет передан в переменную TZ в системах в стиле POSIX (см. Библиотека GNU C: переменная TZ для более подробной информации).

Существует одно заметное исключение, которое заключается в том, что часовые пояса в стиле POSIX используют инвертированный формат смещения, поэтому обычно GMT+3 будет проанализировано как смещение 3 часа позади по Гринвичу. Объект часового пояса tzstr будет анализировать это как смещение на 3 часа вперед по Гринвичу. Если вы хотите поддерживать POSIX поведение, передайте значение True в posix_offset .

Объект tzrange обеспечивает ту же функциональность, но указано с использованием объектов relativedelta.relativedelta . скорее, чем струны.

Параметры:
  • s – Строка часового пояса в формате переменной TZ . Это может быть байта (2.x: str ), str (2.x: unicode ) или поток, испускающий символы юникода (например, StringIO ).
  • posix_offset — Необязательно. Если установлено значение True , интерпретировать такие строки, как GMT+3 или UTC+3 на 3 часа отстает от UTC, а не опережает его, согласно Стандарт POSIX.

Осторожно

До версии 2.7.0 эта функция также поддерживала часовые пояса в формате:

  • EST5EDT,4,0,6,7200,10,0,26,7200,3600
  • EST5EDT,4,1,0,7200,10,-1,0,7200,3600

Этот формат является нестандартным и устарел; эта функция вызовет DeprecatedTZFormatWarning до тех пор, пока поддержка удалена в будущей версии.

класс dateutil.tz. циклический ( fileobj )[источник]

Этот объект предназначен для анализа структуры VTIMEZONE в стиле iCalendar. как указано в RFC 5545, раздел 4.6.5, в один или несколько объектов tzinfo .

Параметры: fileobj — файл или поток в формате iCalendar, который должен быть в кодировке UTF-8 с окончаниями CRLF.
получить ( tzid=None )[источник]

Получить объект datetime.tzinfo по его tzid .

Параметры: tzid – если доступен ровно один часовой пояс, опуская tzid или передача значения None возвращает его. В противном случае действительный требуется ключ (который можно получить из keys() ).
Поднимает: ValueError — Вызывается, если tzid не указан, но их больше или менее 1 определенной зоны.
Возвращает: Возвращает объект datetime.tzinfo , представляющий соответствующий часовой пояс или None , если tzid был не найдено.
ключей ()[источник]

Извлекает доступные часовые пояса в виде списка.

класс dateutil.tz. tzwin ( имя )[источник]

Объект часового пояса, созданный на основе информации о поясе в реестре Windows

Они аналогичны объектам dateutil.tz.tzrange в том, что данные часового пояса предоставляются в формате единого правила смещения за 0 или 2 смены часовых поясов в год.

Параметр: имя Имя ключа часового пояса Windows, например. «Восточное стандартное время». Полный список ключей можно получить с помощью tzwin.list() .

Примечание

Доступно только в Windows

дисплей ()

Вернуть отображаемое имя часового пояса.

статический список ()

Возвращает список всех часовых поясов, известных системе.

переходы ( год )

Для заданного года получить время перехода на летнее время, выраженное всегда на стороне стандартного времени. Для зон без переходов это функция возвращает Нет .

Параметры: год – Год, переходы которого вы хотите запросить.
Возвраты: Возвращает кортеж из объектов datetime.datetime , (dston, dstoff) для зон с ежегодным переходом на летнее время или Нет для зон с фиксированным смещением.

часовых поясов | Документация Джанго

Обзор

Когда включена поддержка часовых поясов, Django сохраняет информацию о дате и времени в UTC в базе данных, использует внутренние объекты datetime с учетом часового пояса и переводит их в часовой пояс конечного пользователя в шаблонах и формах.

Это удобно, если ваши пользователи живут более чем в одном часовом поясе, и вы хотите отображать информацию о дате и времени в соответствии с настенными часами каждого пользователя.

Даже если ваш сайт доступен только в одном часовом поясе, это все равно хорошо практика хранения данных в формате UTC в вашей базе данных. Основная причина — светлое время суток. экономия времени (летнее время). Во многих странах есть система перехода на летнее время, когда часы переводятся весной вперед и осенью назад. Если вы работаете по местному времени, вы, вероятно, столкнетесь с ошибками два раза в год, когда происходят переходы. Это, вероятно, не имеет значения для вашего блога, но это проблема, если вы переплатите. или по счету ваших клиентов на один час, два раза в год, каждый год. Решение этой проблемы состоит в том, чтобы использовать в коде UTC и использовать местное время только тогда, когда взаимодействие с конечными пользователями.

По умолчанию поддержка часовых поясов отключена. Чтобы включить его, установите USE_TZ = True в вашем файле настроек.

Примечание

В Django 5.0 поддержка часовых поясов будет включена по умолчанию.

Поддержка часовых поясов использует zoneinfo , что является частью стандарта Python. библиотека из Python 3.9. Пакет backports.zoneinfo автоматически устанавливается вместе с Django, если вы используете Python 3.8.

Примечание

По умолчанию settings.py файл, созданный django-admin startproject включает USE_TZ = True для удобства.

Если вы боретесь с конкретной проблемой, начните с часового пояса ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ.

Концепции

Наивные и осведомленные объекты datetime

Объекты Python datetime.datetime имеют атрибут tzinfo , который может использоваться для хранения информации о часовом поясе, представленной в виде экземпляра подкласс datetime. tzinfo . Когда этот атрибут установлен и описывает смещение, объект datetime знает . В противном случае это наивное .

Вы можете использовать is_aware() и is_naive() , чтобы определить, осознанный или наивный.

Когда поддержка часового пояса отключена, Django использует наивные объекты даты и времени в локальном время. Этого достаточно для многих случаев использования. В этом режиме для получения текущее время, вы должны написать:

 импорт даты и времени
сейчас = datetime.datetime.now()
 

Когда поддержка часового пояса включена ( USE_TZ=True ), Django использует объекты datetime с учетом часового пояса. Если ваш код создает объекты даты и времени, они тоже должен быть в курсе. В этом режиме приведенный выше пример становится следующим:

 из часового пояса импорта django.utils
сейчас = часовой пояс.сейчас()
 

Предупреждение

Работа с осведомленными объектами даты и времени не всегда интуитивно понятна. Например, аргумент tzinfo стандартного конструктора datetime не работает достоверно для часовых поясов с летним временем. Использование UTC в целом безопасно; если вы используя другие часовые пояса, вы должны просмотреть информация о зоне документацию тщательно.

Note

Объекты Python datetime.time также содержат tzinfo атрибут, и PostgreSQL имеет соответствие времени с типом часового пояса . Однако, как говорится в документации PostgreSQL, этот тип «обладает свойствами, которые привести к сомнительной полезности».

Django поддерживает только наивные объекты времени и вызовет исключение, если вы попытаться сохранить осведомленный объект времени в качестве часового пояса для времени без связанная дата не имеет смысла.

Интерпретация наивных объектов datetime

Когда USE_TZ равно True , Django по-прежнему принимает наивное datetime объекты, чтобы сохранить обратную совместимость. Когда уровень базы данных получает один, он пытается сообщить об этом, интерпретируя его в часовой пояс по умолчанию и выдает предупреждение.

К сожалению, во время перехода на летнее время некоторые даты и время не существуют или двусмысленный. Вот почему вы всегда должны создавать осведомленные объекты даты и времени, когда время поддержка зоны включена. (см. Использование раздела ZoneInfo в файле zoneinfo docs для примеров использования атрибута fold для указания смещение, которое должно применяться к дате и времени во время перехода на летнее время.)

На практике это редко является проблемой. Django дает вам осведомленные объекты даты и времени в моделях и формах, и чаще всего новые объекты datetime создаются из существующие через timedelta арифметику. Единственный datetime, которое часто создается в коде приложения, является текущим временем, а timezone.now() автоматически делает правильная вещь.

Часовой пояс по умолчанию и текущий часовой пояс

Часовой пояс по умолчанию — это часовой пояс, определенный параметром TIME_ZONE параметр.

Текущий часовой пояс — это часовой пояс, который используется для рендеринга.

Вы должны установить текущий часовой пояс на фактический часовой пояс конечного пользователя с помощью активировать() . В противном случае часовой пояс по умолчанию использовал.

Примечание

Как поясняется в документации TIME_ZONE , Django устанавливает переменные среды, чтобы его процесс выполнялся в часовом поясе по умолчанию. Это происходит независимо от значения USE_TZ и текущий часовой пояс.

Когда USE_TZ равно True , это полезно для сохранения обратная совместимость с приложениями, которые по-прежнему полагаются на местное время. Однако, как объяснялось выше, это не полностью надежен, и вы всегда должны работать с осведомленными датами и временем в UTC в вашем собственном коде. Например, используйте отметка времени() и установите для параметра tz значение utc .

Выбор текущего часового пояса

Текущий часовой пояс является эквивалентом текущего языкового стандарта для переводов. Тем не менее, нет никакого эквивалента Accept-Language HTTP-заголовок, который Django может использовать для определения пользовательского часовой пояс автоматически. Вместо этого Django предоставляет выбор часового пояса. функции. Используйте их для построения часового пояса логика выбора, которая имеет смысл для вас.

Большинство веб-сайтов, которые заботятся о часовых поясах, спрашивают пользователей, в каком часовом поясе они живут. и сохранить эту информацию в профиле пользователя. Для анонимных пользователей они используют часовой пояс их основной аудитории или UTC. zoneinfo.available_timezones() предоставляет набор доступных часовых поясов, которые вы можете использовать для построения карты от вероятных местоположений до часовых поясов.

Вот пример сохранения текущего часового пояса в сеансе. (пропускает обработка ошибок исключительно ради простоты. )

Добавьте следующее промежуточное ПО в СРЕДНЕЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ :

 import zoneinfo
из django.utils импортировать часовой пояс
класс TimezoneMiddleware:
    def __init__(я, get_response):
        self.get_response = получить_ответ
    def __call__(я, запрос):
        tzname = request.session.get("django_timezone")
        если имя:
            часовой пояс.активировать(zoneinfo.ZoneInfo(tzname))
        еще:
            часовой пояс.деактивировать()
        вернуть self.get_response (запрос)
 

Создайте представление, которое может установить текущий часовой пояс:

 из django.shortcuts import redirect, render
# Подготовьте карту общих мест для выбора часового пояса, который вы хотите предложить.
common_timezones = {
    «Лондон»: «Европа/Лондон»,
    «Париж»: «Европа/Париж»,
    «Нью-Йорк»: «Америка/Нью-Йорк»,
}
определение set_timezone (запрос):
    если request.method == "POST":
        request.session["django_timezone"] = request. POST["часовой пояс"]
        вернуть перенаправление ("/")
    еще:
        вернуть рендеринг (запрос, "template.html", {"часовые пояса": common_timezones})
 

Включите форму в template.html , которая отправит POST в это представление:

 {% load tz %}
{% get_current_timezone как TIME_ZONE %}
{% csrf_token%} <выбрать имя="часовой пояс"> {% для города, tz в часовых поясах %} {% конец для %}

Ввод с учетом часового пояса в формах

Когда вы включаете поддержку часового пояса, Django интерпретирует дату и время, введенные в формируется в текущем часовом поясе и возвращает осведомленные объекты даты и времени в clean_data .

Преобразованные даты и время, которые не существуют или неоднозначны, поскольку попадают в Переход на летнее время будет отмечен как недопустимые значения.

Вывод с учетом часового пояса в шаблонах

Когда вы включаете поддержку часового пояса, Django преобразует объекты даты и времени с учетом часового пояса в текущий часовой пояс, когда они отображаются в шаблонах. Это очень похоже на локализацию формата.

Предупреждение

Django не преобразует наивные объекты даты и времени, потому что они могут быть двусмыслен, и потому что ваш код никогда не должен создавать наивные даты и время, когда поддержка часового пояса включена. Однако вы можете принудительно преобразовать с помощью шаблонные фильтры, описанные ниже.

Преобразование в местное время не всегда подходит — вы можете выход для компьютеров, а не для людей. Следующие фильтры и теги, предоставляемые библиотекой тегов шаблонов tz , позволяют управлять часовым поясом преобразования.

Теги шаблона

местное время

Включает или отключает преобразование осведомленных объектов datetime в текущее время зона в содержащемся блоке.

Этот тег имеет те же самые эффекты, что и параметр USE_TZ . что касается механизма шаблонов. Это позволяет более точно контролировать преобразование.

Чтобы активировать или деактивировать преобразование для блока шаблона, используйте:

 {% load tz %}
{% по местному времени на %}
    {{ ценить }}
{% endlocaltime%}
{% местное время выключено %}
    {{ ценить }}
{% endlocaltime%}
 

Примечание

Значение USE_TZ не учитывается внутри {% localtime %} блок.

часовой пояс

Устанавливает или сбрасывает текущий часовой пояс в содержащемся блоке. Когда текущий часовой пояс не установлен, применяется часовой пояс по умолчанию.

 {% нагрузки %}
{% часовой пояс "Европа/Париж" %}
    Парижское время: {{ value }}
{% конечный часовой пояс %}
{% часовой пояс Нет %}
    Время сервера: {{значение}}
{% конечный часовой пояс %}
 
get_current_timezone

Вы можете получить название текущего часового пояса с помощью тег get_current_timezone :

 {% get_current_timezone как TIME_ZONE %}
 

В качестве альтернативы можно активировать tz() контекстный процессор и используйте контекстную переменную TIME_ZONE .

Фильтры шаблонов

Эти фильтры принимают как осведомленные, так и наивные даты и время. В целях преобразования, они предполагают, что наивные даты и время находятся в часовом поясе по умолчанию. Они всегда вернуть осведомленные даты и времени.

местное время

Принудительное преобразование одного значения в текущий часовой пояс.

Например:

 {% нагрузки tz %}
{{ значение | местное время }}
 
UTC

Принудительное преобразование одного значения в UTC.

Например:

 {% нагрузки tz %}
{{значение|utc}}
 
часовой пояс

Принудительное преобразование одного значения в произвольный часовой пояс.

Аргумент должен быть экземпляром tzinfo подкласс или название часового пояса.

Например:

 {% нагрузки tz %}
{{ значение|часовой пояс:"Европа/Париж" }}
 

Руководство по миграции

Вот как перенести проект, который был запущен до того, как Django поддерживает время зоны.

База данных

PostgreSQL

Серверная часть PostgreSQL хранит дату и время в виде отметки времени с часовым поясом . В На практике это означает, что он преобразует дату и время из часового пояса соединения в UTC при хранении и от UTC до часового пояса соединения при извлечении.

Как следствие, если вы используете PostgreSQL, вы можете переключаться между USE_TZ = False и USE_TZ = True свободно. Часовой пояс подключения к базе данных будет установлено значение TIME_ZONE или UTC соответственно, так что Django получает правильную дату и время во всех случаях. Вам не нужно выполнять какие-либо данные преобразования.

Другие базы данных

Другие серверные части хранят дату и время без информации о часовом поясе. Если вы переключитесь из USE_TZ = Ложь 9От 0004 до USE_TZ = True , вы должны преобразовать свои данные из местное время в UTC, что не является детерминированным, если ваше местное время имеет летнее время.

Код

Первый шаг — добавить USE_TZ = True в ваши настройки файл. На этом этапе все должно в основном работать. Если вы создаете наивную дату и время объектов в вашем коде, Django сообщает о них, когда это необходимо.

Однако эти преобразования могут завершиться ошибкой при переходе на летнее время, что означает, что вы еще не пользуются всеми преимуществами поддержки часовых поясов. Кроме того, вы, вероятно, столкнуться с несколькими проблемами, потому что невозможно сравнить наивную дату и время с известным датой и временем. Так как Django теперь предоставляет информацию о дате и времени, вы получите исключения везде, где вы сравниваете дату и время, которые исходят от модели или формы с наивной датой и временем, которую вы создали в своем коде.

Итак, второй шаг — рефакторинг вашего кода везде, где вы создаете экземпляр datetime объекты, чтобы сделать их осведомленными. Это можно делать постепенно. django.utils.timezone определяет несколько удобных помощников для совместимости код: сейчас() , is_aware() , is_naive() , make_aware() и make_naive() .

Наконец, чтобы помочь вам найти код, требующий обновления, Django вызывает предупреждение при попытке сохранить наивную дату и время в базе данных:

 RuntimeWarning: DateTimeField ModelName.field_name получил наивный
datetime (2012-01-01 00:00:00), пока активна поддержка часового пояса.
 

При разработке такие предупреждения можно превратить в исключения и получить traceback, добавив в файл настроек следующее:

 import warnings
предупреждения.filterwarnings(
    "ошибка",
    r"DateTimeField .* получил наивную дату и время",
    Предупреждение,
    r"django\.db\.models\.fields",
)
 

Fixtures

При сериализации осведомленной даты и времени включается смещение UTC, например:

 "2011-09-01T13:20:30+03:00"
 

Хотя для наивного datetime это не так:

 "2011-09-01T13:20:30"
 

Для моделей с DateTimeField s эта разница делает невозможным написать приспособление, которое работает как со временем, так и без него поддержка зоны.

Фикстуры, сгенерированные с USE_TZ = False или до Django 1.4, используйте «наивный» формат. Если ваш проект содержит такие приборы, после включения времени зона поддержки, вы увидите RuntimeWarning с, когда вы их загружаете. Получить избавившись от предупреждений, вы должны преобразовать свои приборы в «осведомленный» формат.

Вы можете регенерировать приборы с loaddata затем dumpdata . Или, если они достаточно малы, вы можете отредактировать их, добавив смещение UTC, которое сопоставляет ваш TIME_ZONE с каждой сериализованной датой и временем.

Часто задаваемые вопросы

Настройка

  1. Мне не нужны несколько часовых поясов. Должен ли я включить поддержку часового пояса?

    Да. Когда поддержка часовых поясов включена, Django использует более точную модель. местного времени. Это защищает вас от незаметных и невоспроизводимых ошибок вокруг переходы на летнее время (DST).

    При включении поддержки часовых поясов вы столкнетесь с некоторыми ошибками, потому что вы используете наивную дату и время, когда Django ожидает знать дату и время. Такой ошибки появляются при запуске тестов. Вы быстро научитесь избегать недействительных операции.

    С другой стороны, ошибок, вызванных отсутствием поддержки часовых поясов, гораздо больше. сложнее предотвратить, диагностировать и исправить. Все, что связано с запланированными задачами или арифметика даты и времени — кандидат на тонкие ошибки, которые вас укусят только один-два раза в год.

    По этим причинам поддержка часовых поясов включена по умолчанию в новых проектах, и вы должны сохранить его, если у вас нет очень веской причины не делать этого.

  2. Я включил поддержку часовых поясов. Я в безопасности?

    Возможно. Вы лучше защищены от ошибок, связанных с переходом на летнее время, но вы все равно можете выстрелить себе в ногу, небрежно превратив наивные свидания в осознанные дата и время, и наоборот.

    Если ваше приложение подключается к другим системам — например, если оно запрашивает веб-сервис — убедитесь, что дата и время указаны правильно. Передавать datetime безопасно, их представление должно включать смещение UTC или их значения должны быть в формате UTC (или в обоих!).

    Наконец, наша календарная система содержит интересные пограничные случаи. Например, вы не всегда можете вычесть один год непосредственно из заданной даты:

     >>> импорт даты и времени
    >>> def one_year_before(value): # Неверный пример.
    ... вернуть значение.заменить(год=значение.год - 1)
    ...
    >>> one_year_before(datetime.datetime(2012, 3, 1, 10, 0))
    datetime.datetime(2011, 3, 1, 10, 0)
    >>> one_year_before(datetime.datetime(2012, 2, 29, 10, 0))
    Traceback (последний последний вызов):
    ...
    ValueError: день выходит за пределы допустимого диапазона для месяца
     

    Для корректной реализации такой функции необходимо решить, 2012-02-29 минус один год — это 2011-02-28 или 2011-03-01, что зависит от вашего бизнеса. требования.

  3. Как мне взаимодействовать с базой данных, которая хранит дату и время по местному времени?

    Установите параметр TIME_ZONE на соответствующий часовой пояс для этой базы данных в настройке DATABASES .

    Это полезно для подключения к базе данных, которая не поддерживает часовые пояса. и это не управляется Джанго, когда USE_TZ равно True .

Устранение неполадок

  1. Мое приложение аварийно завершает работу с ошибкой TypeError: не удается сравнить без смещения и datetime с учетом смещения — что не так?

    Давайте воспроизведем эту ошибку, сравнив наивную и осведомленную дату и время:

     >>> из часового пояса импорта django.utils
    >>> осведомлен = часовой пояс.сейчас()
    >>> наивный = часовой пояс.make_naive(осведомленный)
    >>> наивный == знающий
    Traceback (последний последний вызов):
    . ..
    TypeError: невозможно сравнить дату и время без смещения и с учетом смещения
     

    Если вы столкнулись с этой ошибкой, скорее всего, ваш код сравнивает эти два вещей:

    • дата и время, предоставленные Django — например, значение, прочитанное из формы или поле модели. Поскольку вы включили поддержку часовых поясов, он знает.
    • дата-время, сгенерированное вашим кодом, что наивно (иначе вы бы не были читая это).

    Как правило, правильным решением является изменение кода для использования вместо даты и времени.

    Если вы пишете подключаемое приложение, которое должно работать независимо от значения USE_TZ , вы можете найти django.utils.timezone.now() полезно. Эта функция возвращает текущий дата и время как наивная дата и время, когда USE_TZ = False , и как осведомленная дата и время, когда USE_TZ = True . Вы можете добавить или вычесть datetime.timedelta по необходимости.

  2. Я вижу много RuntimeWarning: DateTimeField получил наивный datetime (ГГГГ-ММ-ДД ЧЧ:ММ:СС) при активной поддержке часового пояса – это плохо?

    Когда поддержка часового пояса включена, уровень базы данных ожидает получить знает только дату и время из вашего кода. Это предупреждение появляется, когда он получает наивное свидание. Это указывает на то, что вы не закончили перенос своего кода. для поддержки часового пояса. Советы по этому процессу см. в руководстве по миграции.

    Между тем, для обратной совместимости считается, что дата и время находиться в часовом поясе по умолчанию, чего обычно и следует ожидать.

  3. now.date() вчера! (или завтра)

    Если вы всегда использовали наивные даты и время, вы, вероятно, полагаете, что можете преобразовать дату и время в дату, вызвав ее date() метод. Вы также считаете, что дата очень похожа на datetime , за исключением того, что это менее точно.

    Все это неверно в среде с учетом часового пояса:

     >>> импорт даты и времени
    >>> импортировать информацию о зоне
    >>> paris_tz = zoneinfo.ZoneInfo("Европа/Париж")
    >>> new_york_tz = zoneinfo.ZoneInfo("Америка/Нью-Йорк")
    >>> Париж = datetime.datetime(2012, 3, 3, 1, 30, tzinfo=paris_tz)
    # Это правильный способ преобразования между часовыми поясами.
    >>> new_york = paris.astimezone(new_york_tz)
    >>> париж == нью_йорк, париж.дата() == нью_йорк.дата()
    (Правда, Ложь)
    >>> париж - нью_йорк, париж.дата() - нью_йорк.дата()
    (datetime.timedelta (0), datetime.timedelta (1))
    >>> Париж
    datetime.datetime(2012, 3, 3, 1, 30, tzinfo=zoneinfo.ZoneInfo(key='Европа/Париж'))
    >>> Нью-Йорк
    datetime.datetime(2012, 3, 2, 19, 30, tzinfo=zoneinfo.ZoneInfo(key='Америка/Нью-Йорк'))
     

    Как видно из этого примера, одна и та же дата и время имеет разные даты в зависимости от часовой пояс, в котором он представлен. Но настоящая проблема в другом фундаментальный.

    Datetime представляет момент времени . Это абсолютно: это не зависит ни на что. Напротив, дата — это календарная концепция . Это период времени, границы которого зависят от часового пояса, в котором находится дата обдуманный. Как видите, эти два понятия принципиально разные, и преобразование даты и времени в дату не является детерминированной операцией.

    Что это означает на практике?

    Как правило, вам следует избегать преобразования даты и времени в дата . Например, вы можете использовать дату . фильтр шаблона, чтобы отображать только часть даты даты и времени. Этот фильтр будет преобразовать дату и время в текущий часовой пояс перед его форматированием, чтобы результаты отображались корректно.

    Если вам действительно нужно выполнить преобразование самостоятельно, вы должны убедиться, datetime сначала преобразуется в соответствующий часовой пояс. Обычно это будет текущий часовой пояс:

     >>> из часового пояса импорта django.utils
    >>> timezone. activate(zoneinfo.ZoneInfo("Азия/Сингапур"))
    # В этом примере мы устанавливаем часовой пояс Сингапура, но вот как
    # в общем случае вы получите текущий часовой пояс.
    >>> current_tz = часовой пояс.get_current_timezone()
    >>> местный = париж.astimezone(current_tz)
    >>> местный
    datetime.datetime(2012, 3, 3, 8, 30, tzinfo=zoneinfo.ZoneInfo(key='Азия/Сингапур'))
    >>> местная.дата()
    datetime.date(2012, 3, 3)
     
  4. Я получаю сообщение об ошибке « Определения часовых поясов для вашей базы данных установлен? »

    Если вы используете MySQL, см. раздел Определения часовых поясов. из примечаний MySQL для получения инструкций по загрузке определений часовых поясов.

Использование

  1. У меня есть строка "2012-02-21 10:28:45" и я знаю, что она находится в "Европа/Хельсинки" часовой пояс. Как мне превратить это в осознание дата и время?

    Здесь нужно создать требуемый экземпляр ZoneInfo и прикрепить его к наивная дата и время:

     >>> импорт зоныинформации
    >>> из django. utils.dateparse импортировать parse_datetime
    >>> наивный = parse_datetime("2012-02-21 10:28:45")
    >>> naive.replace(tzinfo=zoneinfo.ZoneInfo("Европа/Хельсинки"))
    datetime.datetime(2012, 2, 21, 10, 28, 45, tzinfo=zoneinfo.ZoneInfo(key='Европа/Хельсинки'))
     
  2. Как узнать местное время в текущем часовом поясе?

    Ну, первый вопрос, а тебе это действительно нужно?

    Вы должны использовать только местное время, когда взаимодействуете с людьми, и слой шаблона предоставляет фильтры и теги для преобразования даты и времени в часовой пояс по вашему выбору.

    Кроме того, Python знает, как сравнивать известные даты и время, принимая во внимание счет UTC смещается при необходимости. Это намного проще (и, возможно, быстрее) чтобы написать всю свою модель и просмотреть код в формате UTC. Итак, в большинстве случаев дата и время в UTC возвращаются на django.utils.timezone.now() будет достаточный.

    Однако для полноты картины, если вам действительно нужно местное время в текущем часовом поясе, вот как его можно получить:

     >>> из часового пояса импорта django.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *