Estou tentando usar o comando date para gerar um registro de data e hora do arquivo que o próprio comando date possa interpretar. No entanto, o comando date não parece gostar de sua própria saída e não tenho certeza de como contornar isso. Caso em questão:
sh-4.2$ date
Fri Jan 3 14:22:19 PST 2014
sh-4.2$ date +%Y%m%dT%H%M
20140103T1422
sh-4.2$ date -d "20140103T1422"
Thu Jan 2 23:22:00 PST 2014
A data parece interpretar a sequência com um deslocamento de 15 horas. Existem soluções alternativas conhecidas para isso?
Edit: este não é um problema de exibição:
sh-4.2$ date +%s
1388791096
sh-4.2$ date +%Y%m%dT%H%M
20140103T1518
sh-4.2$ date -d 20140103T1518 +%s
1388737080
sh-4.2$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1388737080 - 1388791096
-54016
>>> 54016/3600
15.004444444444445
>>>
Ainda está desativado por 15 horas quando exibido como um carimbo de data / hora unix.
EDIT # 1
Talvez eu deva fazer essa pergunta de maneira um pouco diferente. Digamos que eu tenha uma lista dos carimbos de data / hora básicos ISO8601 do formulário:
- AAAAMMDDThhmm
- AAAAMMDDThhmmss
Qual é a maneira mais simples de convertê-los nos carimbos de data e hora Unix correspondentes?
Por exemplo:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
fonte
20140103T1518
não é válido ISO 8601, ele perde a parte do fuso horário #Respostas:
Você solicita "soluções alternativas conhecidas". Aqui está um simples:
Isso usa
sed
para substituir "T" por um espaço. O resultado é um formato quedate
entende.Se adicionarmos segundos à data ISO8601, serão
date
necessárias mais alterações:Acima,
sed
substitui o "T" por um espaço e também separa o HHMMSS em HH: MM: SS.fonte
A documentação do coreutils informa que o "formato estendido" ISO 8601 é suportado.
Você precisará adicionar hífens, dois pontos e um
+%z
para fazê-lo funcionar.Para responder sua segunda parte da pergunta ...
Como o formato da data contém apenas números e símbolos, você pode substituir cada símbolo por uma letra única, por exemplo, usando
tr
Ou você pode analisá-lo usando oe
T
os-
ou+
como separadores, por exemplo, usando shell${var%word}
e${var#word}
expansãoou usando
bash
correspondência de expressão regularou Perl, Python, etc. etc.
fonte
Os coreutils do GNU suportam apenas as datas ISO 8601 como entrada desde a versão 8.13 (lançada em 08/09/2011). Você deve estar usando uma versão mais antiga.
Nas versões anteriores, você precisa substituir o
T
por um espaço. Caso contrário, é interpretado como um fuso horário militar dos EUA .Mesmo nas versões recentes, apenas a forma totalmente pontuada é reconhecida, não o formato básico com apenas dígitos e a
T
no meio.fonte
Eu notei esta nota na página de manual para
date
.Não é conclusivo, mas não mostra explicitamente uma sequência de formato de hora que inclui o
T
que você está tentando, para [ISO 8601]. Como a resposta do @Gilles indicou, o suporte da ISO 8601 no GNU CoreUtils é relativamente novo.Re-formatar a sequência
Você pode usar o Perl para reformular sua string.
Exemplo:
Você pode fazer isso manipular as duas cadeias que incluem segundos e aquelas que não.
20140103T1422:
20140103T142233:
fonte
De acordo com a página do manual da data, o formato que você produz não é o mesmo que o
date
esperado como entrada. Isto é o que a página de manual diz:Então você poderia fazer assim:
Porque nas variáveis usadas para definir a sequência de saída,
+%m%d%H%M%Y
seria igual ao que ela espera como entrada.fonte