我在互联网上搜索了一段时间,但似乎找不到正确的答案(也许有,但我不明白(。
我有这段代码来读取文件并获取日期时间(来自任务调度程序查询(。
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日的任务调度程序查询依赖于区域设置。它可以是以下形式:
- 2013年1月17日
- 2013年1月17日
- 2013/1/17
- 2013年1月17日
- 2013年1月17日
- 2017年1月13日
- 2013年1月17日
- 2013年1月17日
- 2013年1月17日
- 1-17-13
- 17-1-13
- 2017年13月13日
- 2013年11月17日
- 2013年12月17日
- 2013年1月17日
- 1.17.13
- 17.1.13
- 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
结束
更新:请参阅此讨论。日期格式可能是基于运行任务的用户的区域设置。如果是这样的话,你所要做的就是弄清楚如何获得区域环境。。。
正如其他人指出的那样,没有办法解决潜在日期格式中的歧义。
我想探索的是用已知日期查询系统并查看其返回的格式的某种方法。例如,也许你可以在未来的某个(不明确的(日期安排一个假任务,看看该任务以什么格式返回,然后删除它。
这将是一个有点混乱的解决方案,但也许有一种不那么笨拙的方法来做类似的事情。任务调度程序的日期格式与系统日期格式相同吗?如果是这样,您可以从系统中查询已知日期。