を使用して最後の月曜日を見つけることができますが、date -d 'last-monday' +%F
曜日名、月の週、年が与えられたら、日付をどのように知ることができますか?
たとえば、次のようになります。Monday, Week 4, June, 2022
出力:2022-06-20
与えられた:Friday, Week 1, July, 2022
出力:2022-07-01
ベストアンサー1
次のPerlスクリプトは次を使用します。日付::分析そして 日付形式モジュール時間の日付集める基本的な操作もあります。
残念ながら、これらのモジュールはコアPerlモジュールではないため、Perlには含まれません。直接インストールする必要があります。ほとんどのディストリビューション用にパッケージ化されていますsudo apt-get install libtimedate-perl
。たとえば、Debian では Perl を使用してインストールします。ファンユーティリティ(ここでははいPerlに含まれています)。
$ cat decode-week.pl
#!/usr/bin/perl -l
use strict;
use Date::Parse;
use Date::Format;
sub reformat_date {
# parse date from first arg, and tidy it up.
my ($day, $week, $month, $year) = split /\s*,\s*/, shift;
$week =~ s/^Week //; # Don't need that word.
$day =~ s/^(...).*/$1/; # Only need first three letters.
# some useful constants
use constant secs_per_day => 86400; # close enough
use constant one_week => secs_per_day * 7;
# Assumes English. Change as required for other languages.
my %day_names = (Sun => 0, Mon => 1, Tue => 2, Wed => 3,
Thu => 4, Fri => 5, Sat => 6);
# Alternatively, if you want Monday to be the zeroth weekday.
#my %day_names = (Mon => 0, Tue => 1, Wed => 2, Thu => 3,
# Fri => 4, Sat => 5, Sun => 6);
# get time_t for first day of $month $year
my $t = str2time("1 $month $year");
# get abbreviated day name for that 1st day
my $dn = time2str("%a",$t);
# calculate difference in days
my $diff = $day_names{$day} - $day_names{$dn};
if ($week == 1 && $diff < 0) {
return "Invalid week";
};
my $new_t = $t + ($diff * secs_per_day) + (($week-1) * one_week);
# Date::Format doesn't do %F, use identical %Y-%m-%d instead.
return time2str("%Y-%m-%d",$new_t);
};
foreach (@ARGV) {
print "$_ ===> ", reformat_date($_);
};
これは、ログファイルまたは他のファイルから日付を抽出して解析したい場合に簡単に再利用できるように関数で書かれています。現在は、コマンドラインからのみargsを取得します。
出力例:
$ ./decode-week.pl "Monday, Week 1, June, 2022" "Monday, Week 4, June, 2022" "Friday, Week 1, July, 2022"
Monday, Week 1, June, 2022 ===> Invalid week
Monday, Week 4, June, 2022 ===> 2022-06-20
Friday, Week 1, July, 2022 ===> 2022-07-01
有効な日付または少なくとも正しい形式の日付を渡すことを確認するために、一部のデータ検証/検査を使用してサブルーチンを改善できます。これは、読者のための練習用に残した非常に簡単な例です。
また、メインループは、受信した内容を印刷するのではなく、関数によって返された値が「間違った週」であることを確認する必要があります。