Poco DateTimeFormatter - 使用当前时区打印时间戳
Poco DateTimeFormatter - Print timestamp with current timezone
如何根据当前时区将带有 Poco::DateTimeFormatter
的 Poco::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::format
中 tzd
用于根据当前语言环境打印日期时间的正确参数是什么?
系统信息:
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
的源代码并查看 timeZoneDifferential
在 append
函数中的处理方式 - 此参数不影响 小时 在输出中)。
因此,如果您更改为:
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;
}
如何根据当前时区将带有 Poco::DateTimeFormatter
的 Poco::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::format
中 tzd
用于根据当前语言环境打印日期时间的正确参数是什么?
系统信息:
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
的源代码并查看 timeZoneDifferential
在 append
函数中的处理方式 - 此参数不影响 小时 在输出中)。
因此,如果您更改为:
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;
}