Os documentos de informação do coreutils diz que o ISO 8601 "formato estendido" é suportado.
Você precisará adicionar hífens, dois pontos e um +%z
para que funcione.
$ date +"%Y-%m-%dT%H:%M:%S%z"
2014-01-03T16:08:23-0800
$ date -d 2014-01-03T16:08:23-0800
Fri Jan 3 16:08:23 PST 2014
Para responder à sua segunda parte da pergunta ...
Como o formato de data contém apenas números e símbolos, você pode substituir cada símbolo por uma única, por exemplo, usando tr
$ ts="$(date +"%Y-%m-%dT%H:%M:%S%z" | tr -- '-:+' 'hcp')"; echo "$ts"
2014h01h03T16c18c04h0800
$ date -d "$(echo "$ts" | tr -- 'hcp' '-:+')"
Fri Jan 3 16:18:04 PST 2014
Ou você pode analisá-lo usando os separadores T
e -
ou +
as, por exemplo usando shell ${var%word}
e ${var#word}
expansion
$ ts="$(date +"%Y%m%dT%H%M%S%z")"; echo "$ts"
20140103T162228-0800
$ date=${ts%T*}; time=${ts#*T}
etc.
ou usando bash
correspondência de expressão regular
$ ts="$(date +"%Y%m%dT%H%M%S%z")"; echo "$ts"
20140103T165611-0800
$ [[ "$ts" =~ (.*)(..)(..)T(..)(..)(..)(.....) ]]
$ match=("${BASH_REMATCH[@]}")
$ Y=${match[1]}; m=${match[2]}; d=${match[3]}; H=${match[4]}; M=${match[5]}; S=${match[6]}; z=${match[7]}
$ date -d "$Y-$m-$d"T"$H:$M:$S$z"
Fri Jan 3 16:56:11 PST 2014
ou Perl, Python, etc. etc.