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

时间:2010-10-06 12:31:01

标签: windows perl

我正在将一些脚本从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;

我得到了答案,因为我完全糊涂了! 我没有意识到我必须先解析日期!

3 个答案:

答案 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";