当我将Perl程序从Linux移到Windows时,为什么date和数字格式会发生变化?

我正在将一些脚本从一个Linux框移动到一个Windows框,但现在打印的任何数字或date已经失去了格式(即数字四舍五入到小数点后两位,date为2010年6月1日..)。

对于Perl来说,我是一个相当新的人物,无法从他们首先获得格式的位置开始工作,因为脚本中没有任何东西。

我也一直在谷歌search全局设置和环境variables,但我找不到任何可以做到这一点的任何参考?

到目前为止,我已经设法手动添加数字格式,但仍然有点困惑,如何使我的date格式正确,但这两个似乎已经做了其他地方之前..

例子

目前我有这一行:

$text->text("$r_detail->{distance}"); 

其中"$r_detail->{distance}")是一个数字,它来自数据库,我用sprintf('%.1f',$r_detail->{distance})来格式化它。

现在是12.0988790一旦格式化为12.10

date也来自数据库,它使用的行类似于:

 &wh($th,$td,$hrow,30,"SurveyDate:","$r_survey->{sdate}"); 

我无法弄清楚如何格式化。

date现在看起来像: !2003-06-23 09:40:00! 在他们之前!Jun 23 2002 09:40AM!

(它在最后创build一个PDF)

数据库细节和可能的结论
date以“2003-06-23 09:40:00”格式存储在数据库中,它们位于“smalldatetime”列中。 数字以浮点forms存储,并保存到1或2个小数位。 即2.10或15.8

所以正如下面的build议(和我刚刚还记得它最初连接到数据库与DBD :: Sybase,但我不得不改变这个数据库)这是数据库连接,已经改变了我的格式。

我如何最终格式化date

 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; 

我得到了我的答案,因为我完全困惑! 我没有意识到我必须先parsingdate!

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; 

控制日期格式的最好方法是使用日期模块或POSIXstrftime函数之一。

 #!/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会自动把它转换成数字)。

由于您的日期不是日期格式,因此您需要将其转换为日期格式。 幸运的是,你有它的格式很容易转换成相同的格式本地时间返回:

 #!/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"; 

由于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吗?

还有什么改变,也许数据库也从Linux迁移到Windows? 这可能是你看到的只是数据库返回日期值的方式。 如果是这样,你应该寻找一个数据库配置解决方案,或者至少在数据库客户端库配置。

DBI文档中的这个引用可能是相关的

日期和时间以相应数据库引擎的当前默认格式作为字符串返回。 时区效应依赖于数据库/驱动程序。