Poco DateTimeFormatter - печать отметки времени с текущим часовым поясом - PullRequest
0 голосов
/ 07 января 2019

Как мне распечатать 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;
}

Eg: возвращенная строка 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

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Хорошо, если вам не обязательно использовать 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), этот ответ пока не применим к моему делу.

0 голосов
/ 07 января 2019

Вы можете создать 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;
}
0 голосов
/ 07 января 2019

Получите местное время по 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 в выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...