我正在将一些脚本从一个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;
控制日期格式的最好方法是使用日期模块或POSIX
的strftime
函数之一。
#!/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文档中的这个引用可能是相关的
日期和时间以相应数据库引擎的当前默认格式作为字符串返回。 时区效应依赖于数据库/驱动程序。