Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/perl
- ##############################################################################
- # $0 # ma milyen vilagnap van. #
- # $0 +10 # 10 nap mulva milyen vilagnap lesz #
- # $0 -10 # 10 nappal ezelott milyen vilagnap lesz #
- # $0 2020.03.13 # adott datumkor milyen vilagnap lesz? #
- # $0 2020-03-13 # adott datumkor milyen vilagnap lesz? #
- # $0 03-13 # elkovetkezo honap, nap-jan milyen vilagnap lesz #
- ##############################################################################
- use strict;
- use warnings;
- use Time::Local;
- use Data::Dumper;
- # use UTF8;
- # binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
- # binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
- # {month}->{day} = event
- my $fix = {
- 1 => {
- 1 => "A béke világnapja",
- 15 => "A Wikipédia napja",
- 26 => "Nemzetközi vámnap",
- 27 => "A holokauszt nemzetközi világnapja",
- 28 => "Az adatvédelem nemzetközi napja",
- 30 => "A lepra elleni harc világnapja"
- },
- 2 => {
- 2 => "Szerzetesek világnapja / A vizes élőhelyek napja",
- 3 => "Rejtvényfejtök világnapja",
- 4 => "Rákellenes világnap",
- 6 => "A barátságos Internet napja",
- 7 => "A barátságos Internet napja",
- 8 => "A barátságos Internet napja",
- 11 => "Betegek világnapja",
- 14 => "Az epilepszia világnapja",
- 21 => "Az anyanyelv nemzetközi napja / Az idegenvezetők világnapja",
- 22 => "Bűncselekmények áldozatainak napja",
- },
- 3 => {
- 1 => "A polgári védelem világnapja / Az atomfegyvermentes és független Csendes-óceáni térség napja",
- 2 => "A faji megkülönböztetés elleni küzdelem nemzetközi napja (röviden: antirasszista világnap) / Az ima világnapja",
- 3 => "A békéért küzdő írók világnapja",
- 5 => "Lemezlovasok, DJ-k világnapja",
- 6 => "Energiatakarékossági világnap",
- 8 => "Nemzetközi nőnap",
- 14 => "Gátellenes világnap",
- 15 => "Fogyasztóvédelmi világnap / Nemzetközi fókavadászat-ellenes nap",
- 18 => "Az alvás világnapja",
- 19 => "Cigányság világnapja",
- 20 => "A boldogság világnapja",
- 21 => "A költészet világnapja / A faji megkülönböztetés (apartheid) elleni küzdelem napja / A planetáris tudat világnapja / A Down-szindróma Világnapja",
- 22 => "A víz világnapja",
- 23 => "Meteorológiai világnap",
- 24 => "A tuberkulózis (tbc) elleni küzdelem világnapja / Ifjúsági világnap.",
- 25 => "A magzatgyermek napja",
- 26 => "A dokumentumszabadság világnapja",
- 27 => "Színházi világnap",
- },
- 4 => {
- 2 => "Szakszervezeti akciónap / Gyermekkönyvek nemzetközi napja / Az Autizmus Világnapja",
- 3 => "Csillagászati világnap",
- 7 => "Az egészség világnapja",
- 8 => "Roma kultúra világnapja / Az emberszeretet világnapja",
- 11 => "A Parkinson-kór világnapja",
- 12 => "Az űrhajózás világnapja",
- 14 => "A könyvtárosok világnapja",
- 18 => "Műemlékvédelmi világnap / Rádióamatőr világnap",
- 22 => "A Föld napja / Holokauszt világnapja / Az ápolók világnapja.",
- 23 => "A könyv és a szerzői jogok világnapja",
- 24 => "A Kísérleti állatok Világnapja",
- 26 => "A szellemi tulajdon világnapja World Intellectual Property Day",
- 27 => "Vakvezető kutyák világnapja",
- 28 => "Halott és megrokkant dolgozók nemzetközi emléknapja / Testvérvárosok világnapja",
- 29 => "Nemzetközi táncnap",
- },
- 5 => {
- 1 => "Munkavállalók szolidaritási napja",
- 3 => "A nemzetközi sajtószabadság napja",
- 4 => "Tűzoltók napja",
- 5 => "Európa-nap",
- 8 => "A Nemzetközi Vöröskereszt és Vörös Félhold napja / A méltányos kereskedelem (fair trade) világnapja",
- 10 => "Madarak és fák napja",
- 12 => "az ápolónők nemzetközi napja",
- 14 => "Vándormadarak világnapja",
- 15 => "a család nemzetközi napja / Nemzetközi klímaváltozási akciónap",
- 17 => "Az információs társadalom világnapja / A távközlés világnapja / Homofóbia-ellenes világnap",
- 18 => "A múzeumok nemzetközi napja / Az Internet világnapja",
- 19 => "Tömegtájékoztatás világnapja",
- 22 => "A biológiai sokféleség nemzetközi napja / Kihívás Napja(Challenge Day) / Európai Elhízás Elleni Nap",
- 24 => "Európai nemzeti parkok napja",
- 25 => "Afrika napja / „törülközőnap” Douglas Adams emlékére / Eltűnt Gyerekek Világnapja",
- },
- 6 => {
- 1 => "A Torta világnapja",
- 4 => "Az erőszak gyermekáldozatainak világnapja",
- 5 => "Környezetvédelmi világnap",
- 8 => "Az óceánok világnapja",
- 12 => "A gyermekmunka elleni világnap",
- 14 => "Véradók világnapja",
- 16 => "Az afrikai gyermekek világnapja",
- 17 => "A sivatagosodás és aszály elleni küzdelem világnapja",
- 20 => "A menekültek világnapja / Társállatok világnapja",
- 21 => "A zene világnapja / Menj gördeszkázni nap (Go Skateboarding Day)",
- 23 => "Olimpiai világnap / Spamellenes világnap / Nemzetközi SOS Gyermekfalvak napja / A közalkalmazottak napja",
- 26 => "Kábítószer-ellenes világnap / A kínzás áldozatai támogatásának világnapja",
- 27 => "Cukorbetegek világnapja.",
- 29 => "Nemzetközi Duna-nap",
- 31 => "A nemdohányzók világnapja",
- },
- 7 => {
- 2 => "a sportújságírók napja",
- 11 => "népesedési világnap",
- 20 => "a Hold napja",
- 28 => "A hepatitisz világnapja",
- },
- 8 => {
- 1 => "az anyatejes táplálás világnapja",
- 6 => "a nukleáris fegyverek betiltásáért folyó harc világnapja",
- 9 => "a világ őslakosainak nemzetközi napja",
- 10 => "a biodízel nemzetközi napja",
- 12 => "a fiatalok világnapja",
- 13 => "balkezesek világnapja",
- 15 => "repülők napja",
- 16 => "a hontalan állatok világnapja",
- 30 => "az eltűntek világnapja",
- },
- 9 => {
- 1 => "A második világháború emléknapja",
- 8 => "az írástudatlanság elleni küzdelem nemzetközi napja / a fizioterápia világnapja",
- 10 => "az öngyilkosság megelőzésének világnapja",
- 12 => "Gyermekek világnapja",
- 15 => "a demokrácia nemzetközi napja / a mozdonyvezetők napja",
- 16 => "az ózon világnapja / a hangzáskultúra napja",
- 18 => "Takarítási világnap",
- 20 => "európai kultúra napja /biztosítási világnap",
- 21 => "ENSZ nemzetközi békenap / a hála világnapja / Alzheimer-világnap",
- 22 => "európai autómentes nap",
- 23 => "Nemzetközi hulladékgyűjtő nap",
- 26 => "nyelvek európai napja / a tiszta hegyek napja",
- 27 => "Idegenforgalmi világnap",
- 30 => "Fordítás Nemzetközi Napja",
- },
- 10 => {
- 1 => "a zene világnapja / az idősek világnapja",
- 2 => "az erőszakmentesség világnapja / a sztómások világnapja",
- 4 => "az állatok világnapja / a világűr világhete",
- 5 => "pedagógusjogok világnapja / a világűr világhete",
- 6 => "Építészek világnapja. / a világűr világhete",
- 7 => "a világűr világhete",
- 8 => "Madármegfigyelési világnap.",
- 9 => "postai világnap",
- 10 => "A halálbüntetés elleni harc világnapja / a lelki egészség világnapja",
- 14 => "szabványosítási világnap / Steve Jobs Nap",
- 15 => "a fehér bot (a vakok és gyengénlátók) nemzetközi napja / falusi nők világnapja / kézmosás világnapja",
- 16 => "élelmezési világnap / a kenyér világnapja",
- 17 => "a szegénység elleni küzdelem világnapja",
- 20 => "a csontritkulás nemzetközi napja / Statisztikai Világnap",
- 21 => "Földünkért világnap",
- 22 => "a dadogás elfogadásának nemzetközi világnapja",
- 24 => "az ENSZ világnapja / az Origami Világnapja",
- 28 => "az animáció világnapja",
- 31 => "A reformáció emléknapja.",
- },
- 11 => {
- 5 => "európai kereskedelmi nap",
- 6 => "nemzetközi nap a környezet háború és fegyveres konfliktus során történő kifosztásának megelőzéséért",
- 9 => "feltalálók napja",
- 10 => "a tudomány világnapja a békéért és fejlődésért",
- 11 => "a katonai felderítők napja",
- 12 => "minőségügyi világnap",
- 14 => "a cukorbetegek világnapja",
- 16 => "a tolerancia nemzetközi napja",
- 17 => "nemzetközi diáknap / Füstmentes nap",
- 19 => "A nemzetközi férfinap.",
- 20 => "a gyermekek jogainak világnapja / ifjú zenebarátok világnapja / Transzneműek Emléknapja",
- 21 => "a televíziózás nemzetközi napja",
- 25 => "a nők elleni erőszak megszüntetésének világnapja",
- 26 => "a torta világnapja",
- 27 => "a Nobel-díj alapításának napja",
- },
- 12 => {
- 1 => "a békéért bebörtönzöttek nemzetközi napja / AIDS-ellenes világnap",
- 3 => "fogyatékos emberek világnapja",
- 5 => "a gazdasági és szociális fejlődés önkénteseinek világnapja",
- 7 => "a nemzetközi polgári repülés napja",
- 10 => "emberi jogok napja",
- 11 => "nemzetközi hegynap",
- 18 => "emigránsok nemzetközi napja",
- }
- };
- # {month}->[place, dow, event];
- my $mov = {
- 1 => [
- [ 3, 7, "A vallások világnapja"],
- [ -1, 7, "A lepra elleni harc világnapja"]
- ],
- 2 => [
- [ 1 ,4 ,"Választások világnapja"],
- [ 2 ,7 ,"A házasság világnapja"]
- ],
- 3 => [
- [ -1, 6, ", 20.30 – 21.30 A Föld órája"]
- ],
- 4 => [
- [ -1, 7, "Testvérvárosok világnapja"],
- [ 3, 3, "A vakvezető kutyák világnapja"],
- [ 4, 3, "A vakvezető kutyák világnapja"]
- ],
- 5 => [
- [ 1, 7, ". Anyák napja"],
- [ 1, 2, "Az asztma világnapja"],
- [ 2, 6, "A méltányos kereskedelem (fair trade) világnapja"],
- [ -1, 2, "Nemzetközi tejnap"]
- ],
- 6 => [
- [ 1,7, "Pedagógusnap"],
- [ 1,6, "A lakáskultúra világnapja"]
- ],
- 7 => [
- [ 1, 6, "Nemzetközi szövetkezeti nap"],
- [ 1, 6, "Az ölelés napja"],
- [ -1, 5, "A rendszergazdák világnapja"]
- ],
- # 8 => [
- #
- # ],
- 9 => [
- [ 2, 6, "Az elsősegélynyújtás világnapja"],
- [ 3, 6, "Takarítási világnap (szemétszedési világnap)"],
- [ 3, 6, "A kulturális örökség napjai"],
- [ 3, 7, "A kulturális örökség napjai"],
- [ -1, 7, "A szív világnapja"],
- [ -1, 7, "Siketek világnapja"],
- [ -1, 7, "A fehér kendő napja"],
- [ -1, 7, "Tengerészeti világnap"]
- ],
- 10 => [
- [ -1, "work", "Takarékossági világnap"],
- [ 1, 1, "Építészeti világnap vagy Habitat világnap"],
- [ 1, 6, "Madármegfigyelési világnap"],
- [ 1, 7, "Madármegfigyelési világnap"],
- [ 1, 7, "A gyaloglók világnapja"],
- [ 2, 7, "A gyaloglók világnapja"],
- [ 2, 3, "A természeti katasztrófák csökkentésének világnapja"],
- [ 2, 4, "A látás világnapja"],
- [ 2, 5, "A tojás világnapja"],
- [ 2, 6, "A hospice-ellátás világnapja"],
- [ 3, 7, "Missziók világnapja"],
- [ 4, 1, "Az iskolai könyvtárak világnapja "]
- ],
- 11 => [
- [ 1, 5, "Ne vásárolj semmit nap"],
- [ 3, 3, "Térinformatikai világnap (GIS Day)"],
- [ 3, 4, "Dohányzásmentes nap"],
- [ 3, 4, "A filozófia világnapja "],
- [ 3, 7, "A közlekedési balesetek áldozatainak emléknapja"],
- [ 4, 5, "Ne vásárolj semmit nap"]
- ]
- };
- my $mov2 = {
- 11 => [ 15, -1, 5, "Dominónap" ]
- };
- sub isoDate($)
- {
- my $ref = shift;
- return (ref($ref) eq 'ARRAY') ? join('-', map{sprintf("%02d",$_);} @{$ref}) : 0;
- }
- sub isLeapYear($)
- {
- my ($y) = @_;
- my $ret = (!($y % 4) && (($y % 100) || !($y % 400))) ? 1 : 0;
- return $ret;
- }
- sub lastDayOf($$)
- {
- my ($month, $year) = @_;
- my $ret = (grep {$month == $_} 4,6,9,11) ? 30 : ($month == 2) ? isLeapYear($year) ? 29 : 28 : 31;
- }
- sub today()
- {
- my @date = localtime(time);
- $date[5] += 1900; # year
- $date[4] += 1; # month
- map {$_ = '0'.$_ if ($_ < 10)} @date;
- my $ret = [$date[5],$date[4],$date[3]];
- return $ret;
- }
- sub today_and($)
- {
- my $day_diff = shift;
- return undef if (!$day_diff || ($day_diff !~ /^[-+]?\d+$/));
- my @date = localtime(time + (86400*$day_diff));
- $date[5] += 1900; # year
- $date[4] += 1; # month
- my $ret = [$date[5],$date[4],$date[3]];
- return $ret;
- }
- sub validateDate($)
- {
- my $date = shift;
- my $ret;
- if ($date =~ m/(\d\d\d\d)[-\.](\d\d?)[-\.](\d\d?)/)
- {
- my ($year,$month,$day) = ($1,$2,$3);
- eval
- {
- timelocal(0,0,0,$day, $month-1, $year);
- 1;
- };
- $ret = [$year,$month,$day] unless $@;
- }
- return $ret;
- }
- # 1-2-3-4-5 == working day # TODO except big holidays
- sub isItWorkingDay($)
- {
- my $dow = shift;
- return (($dow >= 1) && ($dow <= 5)) ? 1 : 0;
- }
- sub nth_x_day_of($$$$)
- {
- # input: monday = 1, sunday = 0|7;
- my ($n, $dow, $month, $year) = @_;
- my $ret;
- $dow = 0 if ($dow eq 7); # sunday 0, mon-sat 1-6
- my $Day;
- foreach my $day (1 .. (7 * $n))
- {
- my $time = timelocal(0, 1, 1, $day, $month-1, $year-1900);
- my $dow_ = (localtime($time))[6];
- if ($dow eq 'work')
- {
- $n-- if (isItWorkingDay($dow_));
- if (!$n)
- {
- $Day = $day;
- last;
- }
- }
- elsif ($dow !~ /\D/)
- {
- $n-- if ($dow == $dow_);
- if (!$n)
- {
- $Day = $day;
- last;
- }
- }
- }
- # map { $_ = "0$_" if $_ < 10 } $month, $Day;
- $ret = isoDate([$year,$month,$Day]);
- return $ret;
- }
- sub first_x_day_of($$$)
- {
- my ($n, $dow, $month, $year) = (1,@_);
- return nth_x_day_of($n, $dow, $month, $year);
- }
- sub last_x_day_of($$$)
- {
- # input: monday = 1, sunday = 0|7;
- my ($dow, $month, $year) = @_;
- my $ret;
- $dow = 0 if ($dow eq 7);
- my $lastDO = lastDayOf($month, $year);
- my $Day;
- # iterate the last 7 days
- for( my $day = $lastDO; $day > ($lastDO - 7); $day-- )
- {
- my $time = timelocal(0, 1, 1, $day, $month-1, $year-1900);
- my $dow_ = (localtime($time))[6];
- if ($dow eq 'work')
- {
- if (isItWorkingDay($dow_))
- {
- $Day = $day;
- last;
- }
- }
- elsif ($dow !~ /\D/)
- {
- if ($dow == $dow_)
- {
- $Day = $day;
- last;
- }
- }
- }
- # map { $_ = "0$_" if $_ < 10 } $month, $Day;
- $ret = isoDate([$year,$month,$Day]);
- return $ret;
- }
- sub x_day_beforeafter_YMD($$$$$)
- {
- # input: monday = 1, sunday = 0|7;
- my ($dow, $year,$month,$day,$direction) = @_;
- my $ret;
- $dow = 0 if ($dow eq 7);
- my $lastDO = lastDayOf($month, $year);
- die "mtf" if ($day > $lastDO);
- my $Day;
- if ($direction < 0)
- {
- for( my $d = $day; $d > 0; $d-- )
- {
- my $time = timelocal(0, 1, 1, $d, $month-1, $year-1900);
- my $dow_ = (localtime($time))[6];
- if ($dow eq 'work')
- {
- if (isItWorkingDay($dow_))
- {
- $Day = $day;
- last;
- }
- }
- elsif ($dow !~ /\D/)
- {
- if ($dow == $dow_)
- {
- $Day = $day;
- last;
- }
- }
- }
- }
- elsif ($direction > 0)
- {
- for( my $d = $day; $d <= $lastDO; $d++ )
- {
- my $time = timelocal(0, 1, 1, $d, $month-1, $year-1900);
- my $dow_ = (localtime($time))[6];
- if ($dow eq 'work')
- {
- if (isItWorkingDay($dow_))
- {
- $Day = $day;
- last;
- }
- }
- elsif ($dow !~ /\D/)
- {
- if ($dow == $dow_)
- {
- $Day = $day;
- last;
- }
- }
- }
- }
- # map { $_ = "0$_" if $_ < 10 } $month, $Day;
- $ret = isoDate([$year,$month,$Day]);
- return $ret;
- }
- # fix: {month}->{day} = event
- sub getFixDate($)
- {
- my $dateRef = shift;
- return undef unless ref($dateRef) eq 'ARRAY';
- $dateRef = validateDate(isoDate($dateRef));
- my (undef, $month, $day) = @{$dateRef};
- my $ret = $fix->{int($month)}->{int($day)};
- return $ret;
- }
- # mov: {month}->[place, dow, event];
- sub getMovDate($)
- {
- my ($dateRef) = @_;
- # check input
- return undef unless ref($dateRef) eq 'ARRAY';
- $dateRef = validateDate(isoDate($dateRef));
- return undef unless $dateRef;
- my @ret = ();
- my ($year, $month, $day) = @{$dateRef};
- my $isoDate = isoDate($dateRef);
- foreach my $r (@{$mov->{int($month)}})
- {
- my ($place, $dow, $event) = @{$r};
- my $d;
- $d = last_x_day_of($dow,$month,$year) if ($place < 0);
- $d = nth_x_day_of($place,$dow,$month,$year) if ($place > 0);
- push(@ret, $event) if ($d && ($d eq $isoDate));
- }
- {
- # 11 => [ 15, -1, 5, "Dominónap" ]
- my $ref = $mov2->{int($month)};
- if ($ref)
- {
- my ($day, $direction, $dow, $event) = @{$ref};
- my $d;
- $d = x_day_beforeafter_YMD($dow,$year,$month,$day,$direction);
- push(@ret, $event) if ($d && ($d eq $isoDate));
- }
- }
- return wantarray ? @ret : \@ret;
- }
- ##############################################################################
- # handling arguments
- my $today = today();
- my $reqDate;
- # YYYY.MM.DD || YYYY-MM-DD
- $reqDate = [ split(/\D/,$ARGV[0]) ] if ($ARGV[0] && $ARGV[0] =~ m/^\d\d\d\d-|\.\d\d?-|\.\d\d?$/);
- # MM DD
- if (($ARGV[0] && $ARGV[0] =~ m/^\d\d?$/) && ($ARGV[1] && $ARGV[1] =~ m/^\d\d?$/))
- {
- $reqDate = [ $today->[0], $ARGV[0], $ARGV[1] ] if $today->[1] <= $ARGV[0];
- $reqDate = [ $today->[0]+1, $ARGV[0], $ARGV[1] ] if $today->[1] > $ARGV[0];
- }
- # +- D
- $today = today_and($ARGV[0]) if ($ARGV[0] && $ARGV[0] =~ /^[+-]?\d+$/);
- # today
- $reqDate ||= $today;
- # get fix dates
- my $fix_day = getFixDate($reqDate);
- print "fix date: ". isoDate($reqDate) . " $fix_day\n" if $fix_day;
- # get moving dates
- my @mov_day = getMovDate($reqDate);
- print "Mov date: ". isoDate($reqDate) . " " . join("\n",@mov_day )."\n" if @mov_day ;
- print "Vilag nap mentes vilagnap! :)\n" unless (@mov_day || $fix_day);
- =mozgo vilagnapok
- "Ifjúsági világnap" A húsvét előtti vasárnap, azaz virágvasárnap napján
- "Imanap a világ éhezőiért." Farsangvasárnap (a nagyböjt kezdetét megelőző vasárnap)
- "A csillagászat napja" április közepe és május közepe között
- "A Nap napja" a nyári napforduló előtti vagy utáni vasárnap
- "A szentírás vasárnapja" szeptember 30-hoz közel eső vasárnap, általában szeptember utolsó vasárnapja
- "Dominónap" November 15-e, vagy az azt megelőző péntek
- =cut
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement