代码之家  ›  专栏  ›  技术社区  ›  payloc91

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

  •  0
  • payloc91  · 技术社区  · 6 年前

    我怎么打印 Poco::Timestamp 具有 Poco::DateTimeFormatter 基于当前时区的格式化日期时间?

    我有一个 print_pretty_datetime(const Poco::Timestamp &now) 在那里我会收到一个 Poco:时间戳 所以我不能用 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
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Günter Obiltschnig    6 年前

    您可以创建一个 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
  •  1
  •   rafix07    6 年前

    获取本地时间 Poco::LocalDateTime ,然后读取TimesTemp并将其传递到格式化程序:

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

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

    提示(您可以打开 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 在输出中。

        3
  •  0
  •   payloc91    6 年前

    好吧,如果你不需要使用 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:时间戳 尽管我会把它作为参数 print_pretty_datetime(const pc::Timestamp &now) 所以这个答案还不适用于我的案件。