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. 2013/1/17
  3. 2013/1/17
  4. 1/17/13
  5. 17/1/13
  6. 13/1/17
  7. 2013 年 1 月 17 日
  8. 2013 年 1 月 17 日
  9. 2013年1月17日
  10. 1-17-13
  11. 17-1-13
  12. 13-1-17
  13. 2013.1.17
  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
  • yy-mm-dd
  • yy-dd-mm

日や月などのチェックを追加できますが、前に述べたように:
12-11-10 = -9<- 判断できませんよね?

したがって、日付形式に関する外部情報が必要です。たとえば、次のようになります。

  • どの国
  • 科学のどの分野
  • どの家族

に属します。

それができれば、フォーマットと12-11-10 = 12 nov 2010

終わり

于 2013-03-05T10:25:25.533 に答える