Poco DateTimeFormatter - 使用当前时区打印时间戳

Poco DateTimeFormatter - Print timestamp with current timezone

如何根据当前时区将带有 Poco::DateTimeFormatterPoco::Timestamp 打印到格式化的日期时间中?

我有一个 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 returns Mon Jan 7 12.10.12 CET 2019.

Poco::DateTimeFormatter::formattzd 用于根据当前语言环境打印日期时间的正确参数是什么?


系统信息:

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 获取本地时间,然后读取其 timestemp 并将其传递给格式化程序:

Poco::LocalDateTime dateTime;
Poco::Timestamp now = dateTime.timestamp();

您需要定义自己的字符串格式,其中包括有关时区的信息,因为 SORTABLE_FORMAT 无法处理它。

提示(您可以打开 DateTimeFormatter 的源代码并查看 timeZoneDifferentialappend 函数中的处理方式 - 此参数不影响 小时 在输出中)。 因此,如果您更改为:

 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::DateTime 对象从 Poco::Timestamp 在系统当前时区创建 Poco::LocalDateTime

#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;
}