Как мне распечатать Poco::Timestamp с Poco::DateTimeFormatter в формате даты и времени на основе текущего часового пояса?
У меня есть print_pretty_datetime(const Poco::Timestamp &now), на который я получу Poco::Timestamp, поэтому, к сожалению, я не могу использовать Poco::LocalDateTime.
MCVE:
#include "Poco/Timestamp.h"
#include "Poco/Timezone.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include <iostream>
#include <string>
// Cannot change the method signature. I will receive a Poco::Timestamp object
std::string print_pretty_datetime(const Poco::Timestamp &now)
{
return Poco::DateTimeFormatter::format(
now,
Poco::DateTimeFormat::SORTABLE_FORMAT,
Poco::Timezone::tzd()
);
}
int main()
{
Poco::Timestamp now;
std::string dt_now = print_pretty_datetime(now);
std::cout << dt_now << '\n';
return 0;
}
Например: возвращенная строка - 2019-01-07 11:10:12 (т.е. UTC+0), тогда как мое устройство находится в UTC+1.
Фактически, команда date возвращает Mon Jan 7 12.10.12 CET 2019.
Каков правильный параметр для tzd в Poco::DateTimeFormatter::format для печати даты и времени на основе текущей локали?
Системная информация:
SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Poco 1.9.0





Получите местное время с помощью Poco::LocalDateTime, затем прочтите его временную шкалу и передайте в форматтер:
Poco::LocalDateTime dateTime;
Poco::Timestamp now = dateTime.timestamp();
Вам необходимо определить свой собственный строковый формат, который включает информацию о часовом поясе, потому что SORTABLE_FORMAT не обрабатывает его.
Подсказка (вы можете открыть исходный код DateTimeFormatter и посмотреть, как timeZoneDifferential обрабатывается в функции append - этот параметр не влияет на часы в выводе).
Итак, если вы перейдете на:
std::string dt_now = Poco::DateTimeFormatter::format(
now,
"%H:%M:%S %z,%Z",
Poco::Timezone::tzd()
);
вы увидите HH::MM::SS +01:00,+0100 на выходе.
Хорошо, если вам не обязательно использовать Poco::Timestamp, решением может быть просто использование Poco::LocalDateTime:
#include "Poco/LocalDateTime.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include <iostream>
#include <string>
int main()
{
Poco::LocalDateTime now;
std::string dt_now = Poco::DateTimeFormatter::format(
now,
Poco::DateTimeFormat::SORTABLE_FORMAT
);
std::cout << dt_now << '\n';
return 0;
}
и это напечатает дату на основе текущего часового пояса.
Мне все еще нужно использовать Poco::Timestamp, поскольку я получу его как параметр для моего print_pretty_datetime(const pc::Timestamp &now), поэтому этот ответ еще не относится к моему случаю.
Вы можете создать Poco::LocalDateTime в текущем часовом поясе системы из Poco::Timestamp через промежуточный объект Poco::DateTime.
#include "Poco/LocalDateTime.h"
#include "Poco/DateTime.h"
#include "Poco/DateTimeFormat.h"
#include "Poco/DateTimeFormatter.h"
#include <iostream>
int main(int argc, char** argv)
{
Poco::Timestamp ts;
Poco::DateTime dt(ts);
Poco::LocalDateTime ldt(dt);
std::string str = Poco::DateTimeFormatter::format(ldt, Poco::DateTimeFormat::SORTABLE_FORMAT);
std::cout << str << std::endl;
return 0;
}
Круто, не разобрался переход с Timestamp на LocalDateTime
привет хороший момент (я также упомянул об этом в своем ответе). Я отредактировал свой вопрос, так как он был недостаточно ясным. У меня нет контроля над
Timestamp: это параметр, который я получу в своей функции, поэтому на его основе я должен распечатать текущую дату и время.