如何根据当前时区将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
答案 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)
的参数,所以这个答案还不适用于我的情况。