用Perl转换YYYY-MM-DD中的日期



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

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

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$keywordb/, @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.

但问题是,2013年1月17日的任务调度程序查询依赖于区域设置。它可以是以下形式:

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

有什么cpan模块可以做我想做的事情吗?你能给出一个如何实现这一目标的脚本吗?

请不要发表严厉的评论。谢谢

以下内容将为您提供格式:

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;

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

从前

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

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

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

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

我选了4,因为我不知道年份在哪里。

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

  • 年月日
  • 年月日
  • 年月日
  • 年月日

你可以添加几天或几个月的支票,但是,正如我之前所说:
12-11-10 = -9<-不可能确定,对吧?

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

  • 哪个国家
  • 科学的哪个分支
  • 哪个家庭
  • 等等

它属于

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

结束

更新:请参阅此讨论。日期格式可能是基于运行任务的用户的区域设置。如果是这样的话,你所要做的就是弄清楚如何获得区域环境。。。

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

我想探索的是用已知日期查询系统并查看其返回的格式的某种方法。例如,也许你可以在未来的某个(不明确的(日期安排一个假任务,看看该任务以什么格式返回,然后删除它。

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

最新更新