我正在将一些脚本从Linux盒子移动到Windows盒子,但现在打印的任何数字或日期都丢失了格式(即数字被舍入到2位小数,日期为2010年6月1日......)。
我对Perl很陌生,因为脚本中似乎没有任何内容,所以无法确定他们从哪里获得格式化。
我一直在谷歌搜索全局设置和环境变量,但我找不到任何可以做到这一点的参考?
到目前为止,我已设法手动添加数字格式,但仍然对如何使我的日期格式正确感到有点困惑,但这些似乎已经在以前的其他地方完成了..
目前我有这条线:
$text->text("$r_detail->{distance}");
其中"$r_detail->{distance}")
是一个数字而来自数据库,我使用sprintf('%.1f',$r_detail->{distance})
对其进行格式化。
现在12.0988790
格式化为12.10
日期也来自数据库,其使用的行类似于:
&wh($th,$td,$hrow,30,"SurveyDate:","$r_survey->{sdate}");
我根本无法弄清楚如何格式化。
现在的日期如下:!2003-06-23 09:40:00!
在他们!Jun 23 2002 09:40AM!
之前
(它最后创建了一个PDF)
数据库详情&可能的结论
日期以以下格式存储在数据库中:'2003-06-23 09:40:00'它们位于“smalldatetime”列中。
这些数字存储为浮点数,并且是1或2位小数。即2.10或15.8
正如下面所建议的那样(并且我刚刚记得它最初是用DBD :: Sybase连接到数据库但我不得不将其更改为DBI)这是数据库连接已经改变了我的格式。
我最终如何格式化日期
use Date::Parse;
use POSIX;
my $date ="2002-03-18 10:05:00";
my $parsedDate = str2time($date);
my $formattedDate=strftime "%d %b %Y %I:%M%p", localtime $parsedDate;
我得到了答案,因为我完全糊涂了! 我没有意识到我必须先解析日期!
答案 0 :(得分:3)
由于strftime
始终定义了格式,我相信您会从某个外部来源获取日期(例如日期未在perl脚本中格式化)。
系统实用程序的日期格式由LC_TIME
环境变量控制。因此,如果您在perl脚本中解析某个实用程序的输出,您可能希望首先设置此属性(例如,使其在系统范围内设置):
# export LC_TIME=de_DE
# date
Mi 6. Okt 14:54:22 CEST 2010
# export LC_TIME=POSIX
# date
Wed Oct 6 14:54:26 CEST 2010
尝试在控制面板→区域和语言设置中更改设置。如果它影响日期的格式,则您具有依赖于环境的日期格式。然后,您需要检查数据库客户端:它如何处理从表中获取的日期字段。你从DBI得到$r_detail
吗?
答案 1 :(得分:2)
是否有其他更改,也许数据库也从Linux迁移到Windows?您可能看到的只是数据库返回日期值的方式。如果是这样,您应该在数据库配置中寻找解决方案,或者至少在数据库客户端库配置中寻找解决方案。
来自DBI documentation的引用可能是相关的
日期和时间返回为 当前的字符串 相应的默认格式 数据库引擎。时区效应是 数据库/驱动程序依赖。
答案 2 :(得分:1)
Perl 5没有任何数字或日期的默认格式。你能在Linux和MS Windows上发布代码和输出的例子吗?
控制数字格式的最佳方法是使用printf
(打印到文件)或sprintf
(返回一个字符串)。
#!/usr/bin/perl
use strict;
use warnings;
my $n = 16;
printf "%08b %03o %02x %2.5f %010d\n", $n, $n, $n, $n, $n;
控制日期格式的最佳方法是使用其中一个日期模块或POSIX
的{{3}}函数。
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
my @date = localtime;
for my $format (qw(%Y-%m-%d %m/%d/%Y %d/%m/%Y)) {
print strftime($format, @date), "\n";
}
鉴于您的更新,我认为问题不在于Perl 5,而在于您的数据库。您要么更改了要与之通信的数据库,要么在Linux和MS Windows之间控制数据库的环境不同。这绝对是日期的问题,因为Perl 5不知道它是一个日期(它只是将它看作一个字符串)。除非你和他们一起做数学,否则数字也是如此。从数据库返回的数字实际上是一个字符串,而不是数字。它会保留一个字符串,直到你用它做数学运算(此时Perl 5会自动将其转换为数字)。
由于您的日期不是日期格式,因此您需要将其格式化为日期格式。幸运的是,您拥有的格式很容易转换为相同的格式strftime
返回:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
my $input = "2010-06-10 08:50:18.797";
#convert input string into a tm structure like localtime returns
my @localtime = reverse split /[- :]/, $input;
$localtime[5] -= 1900;
$localtime[4]--;
print strftime("%d %b %Y %I:%M%p", @localtime), "\n";