Для корректной работы со временем многим системам необходима информация о часовом поясе клиента. В веб-приложениях эту проблему решают за счет выбора города или зоны в интерфейсе или в профиле пользователя.
При разработке PM Bot (кстати, скоро релиз) ребята из нашей Лаборатории узнали, что Telegram API не передает информацию о таймзоне собеседника, а привычные механики выбора пояса неприменимы для ботов.
Что же делать? Выводить клавиатуру с каждым вариантом? Получается слишком громоздко и неудобно. Просить отправить сообщение с названием города или пояса? Могут быть ошибки как при вводе текста, так и на этапе его обработки ботом.
Мы остановились на удобном для пользователя способе с автоматическим определением на основе геопозиции.
Не так давно в Telegram API появилась возможность расширять варианты ответов в клавиатуре действиями
request_location и request_contact. Теперь для получения координат пользователя достаточно при отправке сообщения от бота настроить параметр reply_markup следующим образом: {
"keyboard": [[
{ "text": "Отправить мою геопозицию", "request_location": true },
{ "text": "Не сейчас" }
]],
"resize_keyboard": true,
"one_time_keyboard": true
}После того как бот получил широту и долготу собеседника, на их основе нетрудно получить временную зону. Для этого не нужно изобретать «велосипед» и можно воспользоваться существующими сервисами вроде Google Maps Time Zone API.
Механику с определением часового пояса по координатам можно использовать не только в ботах, но и, например, в веб-приложениях (в связке с HTML5 Geolocation). Однако следует учитывать, что пользователь может отказать в предоставлении своей позиции, а устройство или приложение может не иметь такой возможности.