This will return a given time zone's current year's non-DST offset from GMT in seconds:
zdump -v "Europe/Berlin" | \
sed ":a;N;\$!ba;s/^.*$(echo -n $(date +%Y)) [^ ]* isdst=0 \
gmtoff=\([^\n]*\)\n.*$/\1/"
3600
What's going on here is that sed matches the current year's first non-dst line returned by zdump for that time zone, and then replaces the entirety of the zdump output with just the end of that first matched line, which is the GMT offset in seconds.
If you need it formatted into +HHMM or -HHMM:
offsetArray=($(zdump -v "America/New_York" | \
sed ":a;N;\$!ba;s/^.*$(echo -n $(date +%Y)) [^ ]* isdst=0 \
gmtoff=\(-*\)\([^\n]*\)\n.*$/\1+ \2/"))
echo "${offsetArray[0]:0:1}$(date -ud @${offsetArray[1]} +%H%M)"
-0500
This creates a an array with two elements, the sign and the absolute value of the offset in seconds. It outputs the former, and formats the latter by passing it through date as time since the epoch (1-Jan-1970 00:00:00 UTC/GMT). Because Bash array assignment ignores leading whitespace, the first element of the array is actually "+" or "-+", and what is displayed is the first character (i.e. + or -).
As an aside, I would think that every year listed by zdump should have the same non-DST offset from GMT, and my original answer just had sed grab the first year it found, but I edited the answer to check the current year to accomodate the theoretical edge case where a time zone has changed since 1901 or something.
(You can remove the trailing backslashes to get the instructions all on a single line, or two lines in the case of the second example.)