You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl中含毫秒与时区的时间戳转换为yyyy-mm-dd格式报错求助

Perl中含毫秒与时区的时间戳转换为yyyy-mm-dd格式报错求助

嗨,我来帮你排查下问题所在~

你遇到的解析错误,核心原因是strptime的格式串和输入时间的格式完全不匹配,具体有两个关键问题:

  1. 输入的日期部分是2024-07-02(带连字符分隔),但你写的格式串里用了%Y%m%d(无分隔符),这直接导致解析器无法识别日期段;
  2. 输入里包含毫秒.000,但格式串里没有对应的占位符来匹配这部分内容。

再加上你用的Perl 5.18.1版本偏老,Time::Piece对部分时间格式的支持有局限,这里给你两种实用的解决方法:

方法一:移除毫秒部分(简单高效,适合仅需日期的场景)

因为你最终只需要日期结果,毫秒完全不影响转换,所以可以先用正则把毫秒部分去掉,再用正确的格式串解析:

use Time::Piece;
my $created = "2024-07-02T11:20:11.000+0200";
# 正则替换掉毫秒段(.后面跟随任意数字)
$created =~ s/\.\d+//;
# 格式串修正为匹配带分隔符的日期,加上时区标识%z
my $test2 = Time::Piece->strptime($created, "%Y-%m-%dT%H:%M:%S%z")->strftime("%Y-%m-%d");
print $test2; # 输出:2024-07-02

方法二:完整匹配毫秒格式(如需保留毫秒处理)

如果后续有使用毫秒的需求,或者想严格匹配输入格式,可以用%3N来匹配三位毫秒(Perl 5.18.1的Time::Piece支持该占位符),修正后的代码如下:

use Time::Piece;
my $created = "2024-07-02T11:20:11.000+0200";
# 格式串包含日期分隔符、毫秒、时区的完整匹配规则
my $test2 = Time::Piece->strptime($created, "%Y-%m-%dT%H:%M:%S.%3N%z")->strftime("%Y-%m-%d");
print $test2; # 输出:2024-07-02

额外补充:旧版本Time::Piece的%z时区格式要求严格匹配+HHMM或-HHMM,你的输入+0200是符合要求的,只要前面的格式匹配正确,就不会再报错啦。

备注:内容来源于stack exchange,提问作者JanFi86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:08:03