0

我已经在互联网上搜索了一段时间,但似乎找不到正确的答案(也许有,但我不明白)。

我有这段代码来读取文件并获取日期时间(来自任务计划程序查询)。

File.txt 包含任务计划程序查询。

"TaskName","Next Run Time","Status"
"CheckFile","20:33:00, 17/1/2013",""

========================================

用于读取获取下一个运行时间值的脚本。

open (FILE, "<", $file) || print "WARN: Cannot open $file: $!";
@logLines = <FILE>;
if (@list = grep(/\b$keyword\b/, @logLines)) {
    foreach(@list){$result = $_;}
    my @sresult = split(/(?<="),(?=")/, $result);
    $name = $sresult[0];
    $name =~ tr/"//d;

    $next_run = $sresult[1];
    $next_run =~ tr/"//d;
    print $next_run;
}
@list=();
@dFormat=();
@logLines=();
close FILE;

输出将是:

20:33:00, 17/1/2013

我想将输出修改为:

20:33:00, 2013-1-17 #note that I can do this just by splitting up and rearranging the numbers.

但问题是,任务计划程序查询中的 17/1/2013 取决于区域设置。它可能在以下位置:

  1. 2013 年 1 月 17 日
  2. 17/1/2013
  3. 2013/1/17
  4. 2013 年 1 月 17 日
  5. 2013 年 17 月 1 日
  6. 2017 年 13 月 1 日
  7. 1-17-2013
  8. 17-1-2013
  9. 2013-1-17
  10. 1-17-13
  11. 17-1-13
  12. 13-1-17
  13. 1.17.2013
  14. 17.1.2013
  15. 2013.1.17
  16. 1.17.13
  17. 17.1.13
  18. 13.1.17

有没有可以做我想做的任何 cpan 模块?你能给出一个关于如何实现这一目标的脚本吗?

请不要严厉评论。谢谢。

4

3 回答 3

2

以下应该为您提供格式:

use Win32::OLE::NLS qw( GetLocaleInfo GetSystemDefaultLCID LOCALE_SSHORTDATE );
say GetLocaleInfo(GetSystemDefaultLCID(), LOCALE_SSHORTDATE);  # yyyy-MM-dd

您可以尝试找到一个可以理解该格式的日期解析器,或者您可以使用类似下面的内容来创建许多解析器都可以理解的格式。

my %subs = (
   'yyyy' => '%Y',
   ...
);

my $pat = join '|', map quotemeta, sort { length($b) <=> length($a) } keys %subs;

$format =~ s{($pat)}{ $subs{$1} // $1 }eg;
于 2013-03-05T13:33:01.387 回答
1

更新: 看到这个讨论。似乎日期格式可能是基于运行任务的用户的区域设置。如果是这样,您所要做的就是弄清楚如何获得该区域设置......

正如其他人指出的那样,没有办法解决潜在日期格式中的歧义。

我要探索的是用已知日期查询系统并查看它返回的格式的某种方式。例如,也许您可​​以在遥远的未来(明确的)日期安排一个假任务,查看该任务返回的格式,然后将其删除。

这将是一个有点混乱的解决方案,但也许有一种不那么笨拙的方式来做类似的事情。任务调度器的日期格式和系统日期格式一样吗?如果是这样,您可以从系统中查询一个已知日期。

于 2013-03-05T10:14:49.350 回答
1

我可以告诉你关于你的问题的答案(算法):

曾几何时

让我们考虑一下您的问题:
您想从每种格式中获取日期。
但这是不可能的,因为它可以12-11-10

好的,现在您必须确定(以某种方式)使用哪种格式。
如果你能做到这一点,你就可以统治世界。

让我们更深入地考虑您的问题:
首先您必须选择分隔符。(或者不,如果你不想要它)
可以使用这样的东西: (\d{1,4})(\D)(\d{1,4})(\D)(\d{1,4})

之后,您有:
$1,$3,$5 # parts of data
$2,$4 # delimiters

我拿了4是因为我不知道年份可以放在哪里。

之后,您必须了解,您拥有哪种格式:

  • dd-mm-yy
  • mm-dd-yy
  • 年月日
  • 年-日-月

您可以添加几天或几个月的检查,但是,正如我之前所说:
12-11-10 = -9<-无法确定,对吗?

所以,你必须有一些关于日期格式的外部信息,例如:

  • 哪个国家
  • 哪个科学分支
  • 哪个家庭
  • ETC

它属于。

如果你能做到这一点,你可以(可能可以)确定格式和12-11-10 = 12 nov 2010

结束

于 2013-03-05T10:25:25.533 回答