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

时间:2019-01-07 11:16:09

标签: c++ datetime locale unix-timestamp poco-libraries

如何根据当前时区将Poco::TimestampPoco::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

tzdPoco::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 :(得分:1)

通过Poco::LocalDateTime获取本地时间,然后读取其timestemp并将其传递给格式化程序:

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

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

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

 std::string dt_now = Poco::DateTimeFormatter::format(
   now,
   "%H:%M:%S %z,%Z",
   Poco::Timezone::tzd()
 );

您将在输出中看到HH::MM::SS +01:00,+0100

答案 1 :(得分:1)

您可以通过中间的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;
}

答案 2 :(得分:0)

好的,如果您不一定需要使用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)的参数,所以这个答案还不适用于我的情况。