#compdef date gdate local -a args alts if _pick_variant gnu="Free Software Foundation" unix --version; then args=( '-d[output specified date]:time string' '-f[output dates specified in file]:file:_files' '-I-[iso-8601]:precision:(date hours minutes seconds)' '-r[reference]:file:_files' '-R[RFC2822 format]' '-s[set]:time string' '--rfc-3339=-[output date and time in RFC 3339 format]:output type:(date seconds ns)' -- '*=FILE*:file:_files' '*=DATEFILE*:date file:_files' ) else case "$OSTYPE" in solaris*) args=( '-a:adjustment' ) ;; darwin*|dragonfly*|netbsd*|openbsd*) args+=( '-r[specify reference time]:seconds since epoch' ) ;| freebsd*|darwin*|dragonfly*|netbsd*|openbsd*) args=( '-n[only set time on current machine]' '-d:daylight saving time value' '-j[do not try to set date]' '-t:minutes west of GMT' ) ;| freebsd*) alts=( 'seconds:sec:_guard "(0x[0-9a-fA-F]#|[0-9]#)" "seconds since epoch"' 'files:file:_files' ) args+=( '-r[reference time: file modification or literal time]:reference: _alternative $alts' '-R[RFC2822 format]' ) ;| freebsd*|dragonfly*|darwin*) args+=( '-f:parsing format' '-v:adjustment value' ) ;; openbsd*) args+=( '-z[specify timezone for output]:time zone:_time_zone') ;| openbsd*|netbsd*) args=( '-a[gradually skew]' ) ;; esac fi _arguments \ '-u[display or set time in UTC]' \ ': :_guard "^--*" "format or date"' \ "$args[@]"