如何从perl中的iso 8601日期和时间获取日期格式
How to get date format from iso8601 datei and time in perl
我正在解析数据并获取日期。然后我将其转换为 iso8601 对象。但是我一直试图只获取年月日期格式。
use DateTime::Format::ISO8601;
use POSIX qw(strftime);
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
my $dt = DateTime::Format::ISO8601->parse_datetime($perl_time_array[1]);
打印2018-07-03T23:06:00
我如何获得日期?我尝试使用
$dt = strftime('%Y-%m-%d',$dt);
但是我收到以下错误。
Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at /home/pi/code/perl/perl_regex_lookahead.pl line 26.
我是只使用正则表达式来获取我要查找的内容,还是可以使用 DateTime::Format::ISO8601
或 strftime
进行格式化?
这里有两个名为 strftime()
的子例程,我认为这让您有些困惑。
您(不小心?)从 POSIX
模块调用 strftime()
函数,正如您的错误消息告诉您的那样,该子例程需要非常具体的参数(基本上是您获得的值列表从 localtime()
或 gmtime()
返回。
但你不需要那样做。您的 $dt
变量是 class DateTime
的对象。 DateTime
对象有自己的 strftime()
方法,您可以调用该对象。
$dt->strftime('%Y-%m-%d'); # 2018-07-03
还值得一提的是,strftime()
方法实际上仅用于创建更模糊的日期和时间格式的字符串。对于常见的格式,DateTime
class 还有其他方法可以使用。例如,您想要的日期格式可以使用 ymd()
方法生成。
$dt->ymd; # 2018-07-03
这意味着您可以从代码中删除 use POSIX
行。您根本不会使用该模块。您需要的一切都在 DateTime
class.
您可以使用 DateTime::Format::Builder 构建灵活的 DateTime 解析器。例如,您可以查看来自 DateTime::Format::MySQL 的源代码。
例如:
package MyTimeParser;
use strict;
use warnings;
use DateTime;
use DateTime::Format::Builder
(
parsers => {
parse_datetime => [
{
# 20180703T230600
regex => qr/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/,
params => [qw( year month day hour minute second )],
},
# here you can describe another format
],
}
);
1;
package main;
use strict;
use warnings;
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
# 2018-07-03
print MyTimeParser->parse_datetime( $perl_time_array[1] )->ymd('-');
exit;
我正在解析数据并获取日期。然后我将其转换为 iso8601 对象。但是我一直试图只获取年月日期格式。
use DateTime::Format::ISO8601;
use POSIX qw(strftime);
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
my $dt = DateTime::Format::ISO8601->parse_datetime($perl_time_array[1]);
打印2018-07-03T23:06:00
我如何获得日期?我尝试使用
$dt = strftime('%Y-%m-%d',$dt);
但是我收到以下错误。
Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at /home/pi/code/perl/perl_regex_lookahead.pl line 26.
我是只使用正则表达式来获取我要查找的内容,还是可以使用 DateTime::Format::ISO8601
或 strftime
这里有两个名为 strftime()
的子例程,我认为这让您有些困惑。
您(不小心?)从 POSIX
模块调用 strftime()
函数,正如您的错误消息告诉您的那样,该子例程需要非常具体的参数(基本上是您获得的值列表从 localtime()
或 gmtime()
返回。
但你不需要那样做。您的 $dt
变量是 class DateTime
的对象。 DateTime
对象有自己的 strftime()
方法,您可以调用该对象。
$dt->strftime('%Y-%m-%d'); # 2018-07-03
还值得一提的是,strftime()
方法实际上仅用于创建更模糊的日期和时间格式的字符串。对于常见的格式,DateTime
class 还有其他方法可以使用。例如,您想要的日期格式可以使用 ymd()
方法生成。
$dt->ymd; # 2018-07-03
这意味着您可以从代码中删除 use POSIX
行。您根本不会使用该模块。您需要的一切都在 DateTime
class.
您可以使用 DateTime::Format::Builder 构建灵活的 DateTime 解析器。例如,您可以查看来自 DateTime::Format::MySQL 的源代码。 例如:
package MyTimeParser;
use strict;
use warnings;
use DateTime;
use DateTime::Format::Builder
(
parsers => {
parse_datetime => [
{
# 20180703T230600
regex => qr/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/,
params => [qw( year month day hour minute second )],
},
# here you can describe another format
],
}
);
1;
package main;
use strict;
use warnings;
my $dt_str = 'Frank_Gibson.20180703T230600.Program_Manager.New_York.doc';
my @perl_time_array = split /\./, $dt_str;
# 2018-07-03
print MyTimeParser->parse_datetime( $perl_time_array[1] )->ymd('-');
exit;