• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

check auf Schaltjahr

regexer

Advanced Hacker
Hallo zusammen!

Ich benutze folgenden code um herauszufinden, ob $YYYY ein Schaltjahr ist.
Code:
if cal 2 ${YYYY} | tail -2 | grep -q 29
then
  echo schaltjahr
else
  echo kein schaltjahr
fi
Frage: gibt es eine intelligentere Lösung? Vielleicht ein eigenes Linux-Binary dafür?

Gruß,

notoxp
 

TeXpert

Guru
ich find die Idee nicht schlecht :) aber als Anregung hab ich mal in meinen dunklen Skriptarchiven gewühlt:
Code:
#!/bin/sh


# leapyear simplified after gregorian calender
# def:  leap year is evenly divisible by 4,
#       but if it's also evenly divisible
#       by 100 then it's not unless it's also evenly
#       divisible by 400.
# source: somewhere on the Net :( I should have noted.

# return 0 or 1
# optional parameter for year if omitted current year is used
isLeapYear() {
# casevariable
  leapyear=${1:-`date +%Y`}
  case $leapyear in
    *0[48] |\
    *[2468][048] |\
    *[13579][26] |\
    *[13579][26]0|\
    *[2468][048]00 |\
    *[13579][26]00 ) return 0 ;;
    *) return 1 ;;
    esac
}



if isLeapYear $1
then
 echo "yes"
else
 echo "no"
fi
 
A

Anonymous

Gast
Ich muss die alte Kamelle hier noch mal anpingen, da ich das Problem grade nochmal mit sed zusammenstellen und austesten durfte
Code:
echo "$JAHR" | sed -n '/\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)/p'

awk kann natürlich rechnen, da gehts auch verständlich und besser wiederverwendbar ;)
Code:
echo "$JAHR" |  awk '{if(($0 % 100 != 0)&&($0 % 4 == 0))print $0; else if($0 % 400 == 0)print$0}'

Bash kann auch rechnen und ist hier in diesem Fall allen oben genannen geschwindigkeitstechnisch haushoch überlegen. Allerdings ergeben sich hier Probleme in den Jahren vor 1000 durch eventuell führenden Nullen, die innerhalb der Bash dann das Jahr als Oktalzahlen interpretieren wollen.
Code:
i=$JAHR; if [ $(($i % 100)) != 0 -a  $(($i % 4)) == 0 ] ; then echo $i ; else if [ $(($i % 400)) == 0 ] ; then  echo $i ; fi; fi

Ausgegeben werden jeweils nur Jahreszahlen wenn es sich um ein Schaltjahr handelt

robi
 
So ich gebe es ja zu tcl ist nicht gerade bash, aber ja auch ne script Sprache :D . Nachdem ich das hier gelesen habe, wollte ich das auch mal testen. Das kam dabei heraus

Code:
#!/usr/bin/env tclsh

# Aktuelles Jahr oder Jahr manuell angeben.
set year [clock format [clock seconds] -format {%Y}]
# set year 0900

# Schutz vor oktal Zahlen.
set year [scan $year %d]

# Wenn Jahr durch 400 teilbar ohne Rest muss es ein Schaltjahr sein.
if {[expr int($year.0 / 400)] == [expr $year.0 / 400]} {
	puts "$year ist ein Schaltjahr."
	exit 0
}
# Wenn Jahr durch 4 aber nicht durch 100 ohne Rest teilbar => Schaltjahr
if {[expr int($year.0 / 4)] == [expr $year.0 / 4] && [expr int($year.0 / 100)] != [expr $year.0 / 100]} {
	puts "$year ist ein Schaltjahr."
	exit 0
}
puts "$year kein Schaltjahr"
exit 0

Grüße

EDIT:
Nach ein paar Minuten nachdenken ist mir noch ne einfachere Version in den Sinn gekommen.

Code:
#!/usr/bin/env tclsh

# Aktuelles Jahr oder Jahr manuell angeben.
#set year [clock format [clock seconds] -format {%Y}]
set year 1000

# Schutz vor oktal Zahlen.
set year [scan $year %d]

# Wenn Jahr durch 400 teilbar ohne Rest muss es ein Schaltjahr sein.
if {$year % 400 == 0} {
	puts "$year ist ein Schaltjahr."
	exit 0
}
# Wenn Jahr durch 4 aber nicht durch 100 ohne Rest teilbar => Schaltjahr
if {$year % 4 == 0 && $year % 100 != 0} {
	puts "$year ist ein Schaltjahr."
	exit 0
}
puts "$year kein Schaltjahr."
exit 0
 

Faxxon

Member
Es geht auch ohne 'if' ( führende Nullen nicht erlaubt ):
Code:
j=JAHR ; [ $(($j % 100)) != 0 -a $(($j % 4)) = 0 ] && echo $j ; [ $(($j % 400)) = 0 ] && echo $j
 
Oben